演算法系列(一) Google方程式

2021-07-05 03:59:24 字數 2017 閱讀 4175

用計算機窮舉所有的解

以上是用人的思維方式的解題過程,如果方法正確,加上運氣好(三次假設都是正 確的,避免在錯誤分支上浪費時間),兩分鐘內就可得到結果。但是考慮到更通用的情況,字母數字 沒有規律,也沒有可供分析的入手點和線索,比如:

aab – bbc = ccd

這樣的問題,該什麼方法解決呢?只能「猜想」,用窮舉的方法試探每一種猜想,對每個 字母和數字窮舉所有可能的組合,直到得到正確的結果。當然,這樣的力氣活交給計算機做是最合適 不過了。

1. 建立數學模型

要想讓計算機解決問題,就要讓計算機能夠 理解題目,這就需要建立乙個計算機能夠識別、處理的數學模型,首先要解決的問題就是建立字母和 數字的對映關係的數學模型。本題的數學模型很簡單,就是乙個字母二元組:。考察 等式:

wwwdot - google = dotcom

共出現了9個不同的字母:w、d、o、t、g、l、e、c 和m,因此,最終的解應該是9個字母對應的字母二元組向量:[ , , , , , , , , ]。窮舉演算法就是對這個字母二元組向量中每個字母二元 組的number元素進行窮舉,number的窮舉範圍就是0-9共10個數字,當然,根據題目要求,有一些字 符不能為0,比如w、g和d。排列組合問題的窮舉多使用多重迴圈,看樣子這個窮舉演算法應該是9重迴圈 了,在每層迴圈中對乙個字母進行從0到9遍歷。問題是,必須這樣嗎,對於更通用的情況,不是9個字 母的問題怎麼辦?首先思考一下是否每次都要遍歷0-9。題目要求每個字母代表乙個數字,而且不重 復,很顯然,對每個字母進行的並不是排列,而是某種形式的組合,舉個例子,就是如果w字母占用了 數字7,那麼其它字母就肯定不是7,所以對d字母遍歷是就可以跳過7。進一步,假設某次遍歷的字母 二元組向量中除m字母外其它8個字母已經有對應的數字了,比如:

[ , , , , , , , , ] (序列-1)

那麼m的可選範圍 就只有2和6,顯然沒必要使用9重迴圈。

現在換一種想法,對9個二元組的向量進行遍歷,可以 分解為兩個步驟,首先確定第乙個二元組的值,然後對剩下的8個二元組進行遍歷。顯然這是一種遞迴 的思想(分治),演算法很簡單,但是要對10個數字的使用情況進行標識,對剩下的二元組進行遍歷時 只使用沒有占用標識的數字。因此還需要乙個標識數字占用情況的數字二元組定義,這個二元組可以 這樣定義:,0-9共有10個數字,因此需要維護乙個長度為10的數字二元組向量。數 字二元組向量的初始值是:

[, ,,,, ,,,,] (序列-2)

每進行一重遞迴 就有乙個數字的using標誌被置為true,當字母二元組向量得到(序列-1)的結果時,對應的數字二 元組向量的值應該是:

[, ,,,,,,,,] (序列-3)

此時遍歷這個數字二元組 向量就可以知道m字母的可選值只能是2或6。

窮舉遍歷的結束條件是每層遞迴中遍歷完所有 using標誌是false的數字,最外一層遍歷完所有using標誌是false的數字就結束了演算法。

根據 題目要求,開始位置的數字不能是0,也就是w、g和d這三個字母不能是0,這是乙個「剪枝」條件,要 利用起來,因此,對字母二元組進行擴充成字母三元組,新增乙個leading標誌:。下面就是這個數學模型的c語言定義:

4 typedef struct

5 charitem;

10

11 typedef struct

12 charvalue;

根據此數學模型初始化字母三元組和數字二元組向量:

29    

30 charitem char_item[max_char_count] =

31 , , ,

33 , , ,

34 , ,

35 };

36

37 charvalue char_val[max_number_count] =

38 , , , ,

40 , , , ,

41 ,

42 };

43

演算法系列一 霍夫曼壓縮

既然是從霍夫曼壓縮入手的,就先來看看它是個什麼東西 一種壓縮演算法,用較少的位元表示出現頻率高的字元,用較多的位元表示出現頻率低的字元。它的大致過程是這樣的 假設壓縮 beep boop beer 計算字元頻次,由小到大排序,得到priority queue 字元次數 r 1 1 p 2 o 2 2...

java演算法系列

棧的概念 棧是一種特殊的線性表,堆疊的資料元素以及資料元素之間的關係和線性表是完全一樣的。差別是線性表是在任意位置進行插入和刪除操作,棧是只允許在固定的一端進行插入和刪除,棧的插入和刪除只允許在棧頂,棧的插入和刪除通常稱為進棧和出棧。資料集合 每個資料元素的資料型別可以是任意的型別 操作的集合 進棧...

演算法系列 Move Zeroes

given an array nums,write a function to move all 0 s to the end of it while maintaining the relative order of the non zero elements.for example,given ...