排序算法的簡要調研

排序算法的代價

排序算法的時間代價主要由排序的時間複雜度決定。目前常見的排序算法根據其時間複雜度可以分爲3類:O(n2)O(n^2)O(nlogn)O(nlogn)O(n)O(n)。其中O(n2)O(n^2)複雜度的算法隨着排序規模增大運行時間難以容忍,而O(n)O(n)複雜度的算法通常對序列的排序元素類型有一定限制,因此最常使用的排序算法複雜度爲O(nlogn)O(nlogn)。任何一個與排序元素類型無關的排序算法,其時間複雜度下界爲O(nlogn)O(nlogn)

如果希望排序算法和排序元素類型無關,排序只能通過值比較的方式完成。如果一個序列存在一個偏序關係\le(也即可值可比較),這個序列必定可以用基於值比較的排序算法進行排序。可以證明,完成排序所需要的值比較次數下界爲O(nlogn)O(nlogn)[1]。因此任何一個與排序元素類型無關的排序算法,其時間複雜度下界爲O(nlogn)O(nlogn)

目前較多排序算法的時間複雜度均爲O(nlogn)O(nlogn),但是它們面對不同規模的負載,運行在不同的硬件環境下時卻各有優劣。這是因爲排序算法的代價還與Cache/TLB 缺失、branch指令總數以及指令級並行性有關

常見排序算法及其應用場景

根據期望時間複雜度劃分,目前的排序算法主要有以下幾種:

  • O(n2)O(n^2):冒泡排序,插入排序,選擇排序,cyclesortcyclesort
  • O(nlog2n)O(nlog^2n):希爾排序,原地歸併排序
  • O(nlogn)O(nlogn):歸併排序,快速排序,推排序,二叉樹排序,冒泡排序的變種combsortcombsort,插入排序的變種圖書館排序
  • O(n)O(n):基數排序,計數排序
  1. 當數據規模較小時,適合使用插入排序、combsortcombsort和選擇排序。如果數據規模較小且兩個數據元素比較代價低,交換代價高,例如型如<key,payload>的數據,其中payload長度遠大於key,適合採用選擇排序。
  2. 當數據規模較大時,適合採用快速排序,堆排序和歸併排序。如果排序有穩定性需求時,適合採用歸併排序。
  3. 當數據接近有序時,可採用插入排序或者冒泡排序。
  4. 當數據爲整數時,適合採用基數排序。特別地,若整數數據值較小且重複值較多時,可採用計數排序。
  5. 當底層內存設備讀寫代價不對稱時例如PCM內存時,適合採用選擇排序和cyclesortcyclesort,因爲兩者的總寫次數爲O(n)O(n).
  6. 當數據規模遠大於可用內存空間時,採用外部多路歸併。

排序算法的優化方向

目前的排序算法的優化研究主要有四個方向:指令級並行SIMD,線程級並行,新型內存技術,AI4Sort。

指令級並行

單指令多數據流(SIMD)是一種採用一個控制器來控制多個處理器,同時對一組數據(又稱“數據向量”)中的每一個分別執行相同的操作從而實現空間上的並行性的技術。排序網絡(Sorting Network)是由多個比較器組織成的網絡結構,有n個輸入端口和輸出端口,可將n個無序數據輸入轉化爲對應的有序輸出。排序網絡並行地工作,可大大提高排序地速度。

在這裏插入圖片描述

利用SIMD指令實現的排序網絡,可對位於向量寄存器中的無序數據並行地排序,且向量排序過程沒有分支跳轉指令,這大大減少總排序過程的指令代價[2-3]。但是利用SIMD技術進行排序規模受限於向量寄存器的長度,因此SIMD實現的排序網絡只可作爲building block,它生成多個有序的小向量,然後外層將這多個有序向量進行歸併。

quicksort並不適合利用SIMD來優化,因爲quicksort的劃分出來的子塊並不均勻。對於歸併排序算法而言,基本所有的子塊大小都相等,因此當子塊大小劃分達到向量長度閾值時,可以採用SIMD來加速對子塊的排序。

進程級並行:

多處理器並行排序算法主要分爲兩大類:merge-based 和 splitter-based算法。其中merge-based算法代表爲bitonic sort,splitter-based算法代表有sample-sort和histogram-sort。此外還有radix-sort的並行版本。

merge-based的算法和splitter-based的算法均需要將排序工作量劃分給多個處理器,從而成倍地減少總時間代價。兩種算法地差別在於處理器將局部有序數據得到最終全序數據的方式:

  • merge-based算法在每個處理器執行局部數據的排序之後,採用並行merge的方式得到最終的有序數據。merge階段中通信次數較多,通常爲one-to-one通信模式;
  • splitter-based算法完成局部數據排序後,則嘗試抽取數據中的p-1個數據作爲splitter,根據它將每個處理器局部數據劃分成p塊,然後處理器執行一次all-to-all通信將對應塊發送給對應處理器。此後處理器之間數據有序,每個處理器將接受到的p個數據塊merge後得到最終結果。

在鬆耦合的處理器結點網絡中,網絡通信代價往往是系統的瓶頸所在,在這種系統下需要儘量減少數據傳輸量和傳輸次數,以及結點同步操作。splitter-based算法具有通信數據傳輸少,且同步代價低的優點,因此常常成爲優先考慮的優化對象[4]。此外,很多研究均希望提高劃分元素劃分的均勻性,從而提高算法的擴展性和適應性。

新型內存:

非易失性內存(NVM)引入之後,傳統的內存排序算法獲得了新的研究契機。NVM技術存在諸多與DRAM大不相同的特性,其中影響排序性能的NVM特性主要爲讀寫延遲稍高,讀寫代價不對稱性和持久性。針對NVM內存排序研究可根據其考慮的內存架構劃分:DRAM和NVM上下級架構,DRAM和NVM混合架構,純NVM內存架構。

  • DRAM和NVM上下級架構下,內存排序的優化點在於減少DRAM與NVM之間的通信代價[5,6]。這類似傳統外部排序需要減少DRAM和HDD/SSD的I/O代價,但不同點在於I/O粒度不再爲page,同時I代價可能會低於O代價。外部多路歸併排序十分適合這種場景,因爲多路歸併能顯著減少總I/O次數,且能夠適應DRAM空間較少的環境。文獻[7]從形式化角度考慮了面對讀寫不對稱架構下,多路歸併排序通過以讀換寫的方式,減少歸併階段的趟數,從而減少對下層介質的總I/O次數。文獻[5]的研究則同樣考慮多路歸併排序算法,並利用一些相關技術減少多路歸併過程中的數據寫回。
  • 在混合DRAM和NVM內存架構下,內存排序優化點在於如何將內存排序的讀寫集中在延遲更低的DRAM內存空間上去。文獻[6]認爲,多路歸併排序是最適合混合內存架構下的排序算法。作者認爲只需要讓排序算法將混合內存空間當成上下層架構,充分減少DRAM和NVM之間的數據移動代價即load store次數即可。
  • 針對純NVM內存架構的排序算法,其優化點會集中在如何在只引入O(n)O(n)的寫的情況下,將算法時間複雜度降低O(nlogn)O(nlogn)及以下(我們知道,選擇排序和cycle排序的寫代價僅爲O(n)O(n),但是其總時間代價太差)。文獻[8]研究了近似存儲(Approximate computing,近似存儲是犧牲寫的精確性以降低寫延遲提高寫性能的存儲技術,PCM就是這樣的一種持久性近似存儲)內存技術下不同排序算法性能。爲了保證最終排序的正確性,在近似存儲上的排序結果需要經過一個精煉階段,這將與機器學習技術引入排序算法類似。
AI4Sort:

衆所周知,機器學習技術大都是基於統計學和概率論的學習算法,因此並不能保證結果的絕對(100%)精確。而穩定的排序算法針對每個輸入只有唯一的輸出,這是一個精確地排序過程。應用機器學習技術提升排序算法性能,勢必在需要排序最後引入一個精煉階段。文獻[9,10]提出了利用機器學習技術,從歷史的排序數據中學習得出一個在無序數列的數據到其最終有序位置的映射,根據這個模型我們可以在線性時間內將無序數據排序成一個大致有序的數列,最後利用精煉步驟將這個大致有序的數據排序。由於機器學習模型排序數據大致有序,最終精煉步驟的時間代價可以大大縮減,在實際應用中,可能達到總體上線性的排序時延。

參考文獻:

[1]. 基於比較的排序算法複雜度下限, https://www.zhihu.com/question/24516934/answer/28076722

[2]. Hiroshi Inoue, Kenjiro Taura: SIMD- and Cache-Friendly Algorithm for Sorting an Array of Structures. PVLDB 8(11): 1274-1285 (2015)

[3]. Michael Codish, Luís Cruz-Filipe, Markus Nebel, Peter Schneider-Kamp: Optimizing sorting algorithms by using sorting networks. Formal Asp. Comput. 29(3): 559-579 (2017)

[4]. Edgar Solomonik, Laxmikant V. Kalé: Highly scalable parallel sorting. IPDPS 2010: 1-12

[5]. Stratis Viglas: Write-limited sorts and joins for persistent memory. PVLDB 7(5): 413-424 (2014)

[6]. Mohammed Bey Ahmed Khernache, Arezki Laga, Jalil Boukhobza: MONTRES-NVM: An External Sorting Algorithm for Hybrid Memory. NVMSA 2018: 49-54

[7]. Guy E. Blelloch, Jeremy T. Fineman, Phillip B. Gibbons, Yan Gu, Julian Shun: Sorting with Asymmetric Read and Write Costs. SPAA 2015: 1-12

[8]. Shuang Chen, Shunning Jiang, Bingsheng He, Xueyan Tang: A Study of Sorting Algorithms on Approximate Memory. SIGMOD Conference 2016: 647-662

[9]. Zhu, Xiao-ke, Taining Cheng, Qi Zhang, Ling Liu, Jing He, Shaowen Yao and Wei Zhou. NN-sort: Neural Network based Data Distribution-aware Sorting. (2019).

[10]. The case for a learned sorting algorithm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章