hash,一般翻譯做雜湊、雜湊,或音譯為雜湊,是乙個典型的利用空間換取時間的演算法,把任意長度的輸入(又叫做預對映pre-image)通過雜湊演算法變換成固定長度的輸出,該輸出就是雜湊值。
如有乙個學生資訊表:學生的學號為:年紀+學院號+班級號+順序排序號【如:19(年級)+002(2號學院)+01(一班)+17(17號)---190020117】類似於乙個這樣的資訊,當我們需要找到這個學號為的學生,在不適用雜湊的時候,我們通常是使用乙個順序遍歷的方式在資料中進行查詢大類,再查詢子類得到,這樣的作法很明顯不夠快 ,需要o(n)左右的時間花費,對於大型的資料規模而言這顯然不行,而雜湊的做法是,根據一定的規律(比如說年紀不存在過老和過小的情況,以此將進行壓縮成乙個簡短的資料如:)並且將這個資料直接作用於記憶體的位址,屆時我們查詢只需要進行一次壓縮並訪問這個位址即可,而這個壓縮的方法(函式),就可以稱之為雜湊函式。一般的對於雜湊函式需要考慮如下內容:
計算雜湊位址所需要的時間(即hash函式本身不要太複雜)
關鍵字的長度
表長(不宜過長或過短,避免記憶體浪費和算力消耗)
關鍵字分布是否均勻,是否有規律可循
設計的hash函式在滿足以上條件的情況下儘量減少衝突
hash演算法是乙個廣義的演算法,也可以認為是一種思想,使用hash演算法可以提高儲存空間的利用率,可以提高資料的查詢效率,也可以做數字簽名來保障資料傳遞的安全性。所以hash演算法被廣泛地應用在網際網路應用中。
動態規劃的基本思想是:問題的最優解如果可以由子問題的最優解推導得到,則可以先求解子問題的最優解,再構造原問題的最優解;若子問題有較多的重複出現,則可以自底向上從最終子問題向原問題逐步求解。
比如說著名的斐波那契定理a[i]=a[i-1]+a[i-2],就是乙個特別好的理解方式,為什麼直接寫公式的演算法(自底向上,從1開始遞增)效率就是比遞迴(自頂向下,從n開始向下)的要好?
讓我們來熟悉一下動態規劃的特點:
把原始問題劃分成一系列子問題;
求解每個子問題僅一次,並將其結果儲存在乙個表中,以後用到時直接訪問,不重複計算,節省計算時間。
自底向上地計算。
整體問題最優解取決於子問題的最優解(狀態轉移方程)(將子問題稱為狀態,最終狀態的求解歸結為其他狀態的求解)
很簡單,因為遞迴的方式return f(n-1)+f(n-2)會產生一些重複計算,當計算f(5)+f(4)中,f(5)其實又包含了一次f(4),而動態規劃的出現,就是為了減少這樣的重複計算,通過確認乙個個的狀態以及到達下乙個狀態的【狀態轉移方程】,來表現,一般而言,我們使用數學語言直接表示【狀態轉移方程。
貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。
貪心演算法的基本思路是從問題的某乙個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得區域性最優解。每一步只考慮乙個資料,他的選取應該滿足區域性優化的條件,直到把所有資料列舉完。貪心演算法的思想如下:
建立數學模型來描述問題;
把求解的問題分成若干個子問題;
對每一子問題求解,得到子問題的區域性最優解;
把子問題的解區域性最優解合成原來解問題的乙個解。
與動態規劃不同的是,貪心演算法得到的是乙個區域性最優解(即有可能不是最理想的),而動態規劃演算法得到的是乙個全域性最優解(即必須是整體而言最理想的),乙個有趣的事情是,動態規劃中的01揹包問題就是乙個典型的貪心演算法問題。
博弈/博弈論,又稱為對策論(game theory)、賽局理論等,既是現代數學的乙個新分支,也是運籌學的乙個重要學科。博弈論主要研究公式化了的激勵結構間的相互作用,是研究具有鬥爭或競爭性質現象的數學理論和方法,博弈論考慮遊戲中的個體的**行為和實際行為,並研究它們的優化策略。總而言之,博弈,就是兩方(或者多方)在為了某一種目標進行的競爭。
博弈問題的特點
博弈模型為兩人輪流決策的非合作博弈。即兩人輪流進行決策,並且兩人都使用最優策略來獲取勝利。
博弈是有限的。即無論兩人怎樣決策,都會在有限步後決出勝負。
公平博弈。即兩人進行決策所遵循的規則相同。
資料結構學習
什麼是資料結構 對計算機記憶體中的資料的一種安排。資料結構有那些?優缺點?1.陣列 插入快 知道下標 查詢慢,刪除慢,大小固定 2.有序陣列 比無序的查詢塊,刪除和插入慢,大小固定 3.棧 吃多了吐 個人理解 4.佇列 吃多了拉 個人理解 5.鍊錶 插入快,刪除快,查詢慢 6.二叉樹 查詢 插入 刪...
資料結構學習
鍊錶 class listnode definit self,x self.val x 節點值 self.next none 後繼節點值 例項化節點 n1 listnode 4 節點head n2 listnode 5 n3 listnode 1 構建引用指向 n1.next n2 n2.next ...
資料結構 學習
外部學習資料位址 一 描述 1.arraylist 是最常用的list 實現類,內部是通過陣列實現的,它允許對元素進行快速隨機訪問。2.陣列的缺點是每個元素之間不能有間隔,當陣列大小不滿足時需要增加儲存能力,就要將已經有陣列的資料複製到新的儲存空間中。3.當從arraylist 的中間位置插入或者刪...