現在位置: 首頁 > 演算法 > 文章
2020年02月17日 演算法 ⁄ 共 4983字 評論關閉
  本文將介紹幾種常見的限流(Rate Limiting)演算法,以及各自的優缺點,之後將介紹分散式集群環境下如何設計限流演算法,最後展示Kong是如何實現的。   限流(Rate Limiting, 即速率限制)通過限制每個用戶調用API的頻率來防止API被過度使用,這可以防止他們因疏忽或惡意導致的API濫用。在沒有速率限制的情況下,每個用戶可以隨心所欲地請求,這可能會導致「峰值」請求,從而導致其他用戶得不到響應。在啟用速率限制之後,它們的請...
閱讀全文
2020年02月17日 演算法 ⁄ 共 2722字 評論關閉
  本文實例講述了PHP自定義函數實現格式化秒的方法。分享給大家供大家參考,具體如下:   function vtime($time) {   $output = '';   foreach (array(86400 => '天', 3600 => '小時', 60 => '分', 1 => '秒') as $key => $value) {   if ($time >= $key) $output .= floor($time/$key) . $value;   $time %= $key;   }   if($output==''){   $output=0;   }   return $output;   } ...
閱讀全文
2020年02月14日 演算法 ⁄ 共 3595字 評論關閉
  桶排序是計數排序的升級版。它利用了函數的映射關係,高效與否的關鍵就在於這個映射函數的確定。為了使桶排序更加高效,我們需要做到這兩點:   在額外空間充足的情況下,盡量增大桶的數量。   使用的映射函數能夠將輸入的 N 個數據均勻的分配到 K 個桶中。   同時,對於桶中元素的排序,選擇何種比較排序演算法對於性能的影響至關重要。   1. 什麼時候最快   當輸入的數據可以均勻的分配到每一個桶中。   2. 什...
閱讀全文
2020年02月14日 演算法 ⁄ 共 5368字 評論關閉
  基數排序是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字元串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。   1. 基數排序 vs 計數排序 vs 桶排序   基數排序有兩種方法:   這三種排序演算法都利用了桶的概念,但對桶的使用方法上有明顯差異:   基數排序:根據鍵值的每位數字來分配桶;   計數排序:每個桶只存儲單...
閱讀全文
2020年02月14日 演算法 ⁄ 共 1167字 評論關閉
  用最簡單的方法,通俗易懂的方法計算結構體大小。   結構體計算要遵循位元組對齊原則。   結構體默認的位元組對齊一般滿足三個準則:   1) 結構體變數的首地址能夠被其最寬基本類型成員的大小所整除;   2) 結構體每個成員相對於結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);   3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯...
閱讀全文
2020年02月14日 演算法 ⁄ 共 4092字 評論關閉
  C 語言中整數與字元串的相互轉換,有廣泛應用的拓展函數(非標準庫),也可以自己嘗試簡單的實現。   整數轉字元串   1、拓展函數 itoa   itoa (表示 integer to alphanumeric)是把整型數轉換成字元串的一個函數。   windows 環境下,在 頭文件中有:   char* itoa(int value,char*string,int radix);//value: 要轉換的整數,string: 轉換後的字元串,radix: 轉換進位數,如2,8,10,16 進位等。   函數源碼:   ch...
閱讀全文
2020年02月14日 演算法 ⁄ 共 4872字 評論關閉
  編程中經常用到時間表達及轉換的函數,它們都定義在 time.h 庫函數中,在此做一下總結,以方便後續查看使用。   幾個時間概念:   1:Coordinated Universal Time(UTC):   協調世界時,又稱世界標準時間,也即格林威治標準時間(Greenwich Mean Time,GMT),中國內地的時間與UTC得時差為+8,也即UTC+8,美國為UTC-5。   2:Calendar Time:   日曆時間,是用"從一個標準時間點到此時的時間經過的秒數"來表示的時間...
閱讀全文
2020年02月14日 演算法 ⁄ 共 8116字 評論關閉
  最短路徑是圖論中一個很經典的問題:給定圖G(V,E),求一條從起點到終點的路徑,使得這條路徑上經過的所有邊的邊權之和最小。   對任意給出的圖G(V,E)和起點S、終點T,如何求從S到T的最短路徑。解決最短路徑問題的常用演算法有Dijkstra演算法、Bellman-Ford演算法、SPEA演算法和Floyd演算法。   1.Dijkstra演算法   Dijkstra演算法(讀者可以將其讀作「迪傑斯特拉演算法」)用來解決單源最短路問題,即給定圖G和起點s,通過演算法得到S到達其...
閱讀全文
2020年02月13日 演算法 ⁄ 共 5357字 評論關閉
  Java的volatile關鍵字用於標記一個變數「應當存儲在主存」。更確切地說,每次讀取volatile變數,都應該從主存讀取,而不是從CPU緩存讀取。每次寫入一個volatile變數,應該寫到主存中,而不是僅僅寫到CPU緩存。   實際上,從Java 5開始,volatile關鍵字除了保證volatile變數從主存讀寫外,還提供了更多的保障。我將在後面的章節中進行說明。   變數可見性問題   Java的volatile關鍵字能保證變數修改後,對各個線程是可見...
閱讀全文
2020年02月13日 演算法 ⁄ 共 1415字 評論關閉
  1. 問題可分而治之且 BFS   首先, 問題必須是可分而治之的, 並在最後合併. 分而治之(遞歸)是為了窮舉, 合併是為了找最優.   Result r(costs[], target){   args = [];   for(cost in costs){   tmp = r(costs - cost, target - cost) + cost;   args += tmp;   }   return G(args);   }   雖然上面的代碼是 DFS, 但形式上是 BFS, 而且也應該寫成 BFS, 只不過 BFS 的代碼不簡潔而已.   思考: 與貪婪算...
閱讀全文