二輸入比較器實現排序算法

歡迎你們經過博客瀏覽個人歷史文章,博客園包含了目前爲止全部的文章,瀏覽效果更佳,而且有評論留言功能,有任何問題均可以給我留言,微信後臺留言可能回覆得不及時。html

博客地址爲:https://www.cnblogs.com/icparadigm/node

面試題 - 二輸入比較器實現排序算法

轉載自love小酒窩linux

https://www.cnblogs.com/lyc-seu/p/13385782.htmlweb

1. 問題描述

給定8個數,以及若干二輸入的比較器(能夠將兩個輸入排序)。要求在單週期內實現8個數的排序,並使用最少的比較器個數。(樂鑫)面試

(距離面試已通過了好久,抽空整理一下當時的題目)算法

2. 問題解析

乍一看,排序算法,這不是個算法題麼,將8個數排下序,腦子裏最早出來的是什麼冒泡,選擇,插入排序......趕忙打住,咱們如今在討論電路,不要走錯片場了。實際上題目限定了二輸入的比較器,因此方向很明確,如今已經有二輸入排序模塊,咱們要用這個二輸入的模塊搭成8輸入的。那麼天然也就能想到,先搭個4輸入的,看有沒有什麼規律。如今問題簡化爲4輸入排序,很天然就想到,先分兩組,每組之間排一下:(*表示較大的輸出)vim

這樣排完之後要解決的問題就是組間的大小問題。首先,兩組之間最大的比較一下就能出來四個中最大的,兩組最小的比較出來四個中最小的。因此第二級比較又須要兩個比較器。第二級結束後咱們已經獲得了最大和最小,但次大和次小還不能肯定,因此須要一個額外的比較器肯定次大次小。因此四個數的排序電路以下:微信

因此4個數進行排序須要的最少的二輸入比較器個數是5個。那麼如今問題回到8個數,實際上咱們至關於已經有了4輸入進行排序的模塊,用若干個4輸入排序模塊來完成8輸入排序。相對於二輸入模塊,四輸入的模塊的輸出能夠分爲兩組,一組最大次大,另外一組最小次小。實際上仍是按照剛纔的拓撲結構,將二輸入換成四輸入便可:app

仍是按照以前的思路,首先8個輸入分爲兩組,每組之間排序。以後按照剛纔的邏輯,上一組的最大次大和下一組的最大次大送入四輸入排序模塊,就能夠肯定出8個數中的最大和次大。這裏可能有人會有疑問。假設如圖中所示,第一層出來之後上面的模塊輸出最大次大是B和C,下面模塊輸出最大和次大是H和F,這四個數中必定會產生8個數中的最大和次大值麼?答案是確定的,由於對於A和D而言,B和C必定比他們大,因此沒權利坐上8個裏的第一第二的寶座,同理E和G也是。因此最大和次大值必定在B,C,H,F中產生。同理,最小和次小就會在A,D,H,F中產生。因此第二級結束後8個數中的最大,次大,最小, 次小就肯定了。剩下四個再來一級比較一下就排序完成了。因此按照這種方法,8個數進行排序須要的二輸入比較器個數就是5*5=25個。編輯器


經評論區@SpiritzQAQ君的提示,確實後面三個4輸入模塊不必取完整,實際上能夠只用4輸入模塊中的後三個二輸入比較器,由於這幾級的輸入大小關係已經肯定,更改後的拓撲圖以下:

img

只須要5*2+3*3 = 19 個比較器。

3. 延伸思考

事實上,上面的硬件實現方式就是歸併排序的展開實現,歸併排序算法以下:

參考:https://www.cnblogs.com/onepixel/articles/7674659.html

歸併排序是創建在歸併操做上的一種有效的排序算法。該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。將已有序的子序列合併,獲得徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲2-路歸併。算法描述:

  • 把長度爲n的輸入序列分紅兩個長度爲n/2的子序列;
  • 對這兩個子序列分別採用歸併排序;
  • 將兩個排序好的子序列合併成一個最終的排序序列。

再想一下,這一題最本質的問題實際上是:

給定n個數的排序,最少須要的比較次數是多少?

若是從信息論的角度來看,n個數的排序總共有  種狀況,對應的信息量就是  ,而一次比較得到的信息量  .因此理論的最少比較次數就是: 。能夠發現當n=4時,理論比較次數爲  , 向上取整就是5,跟咱們的電路中用到的比較器個數相同。可是當n=8時,理論的最少比較次數是  ,也就是須要16次比較。那爲何咱們這裏用到了25個比較器呢?實際上這是由於題目限制了咱們只能使用比較器,而要實現理論最小的比較次數還須要其餘邏輯的支持,好比MUX。因此上述19個比較器只是歸併排序算法的一種硬件實現方式,但並不必定是比較次數最少的硬件實現方式(考慮使用其餘邏輯的話)。

PS: 5個數排序的理論最少排序次數(7)的一種比較邏輯:5個數排序最少比較次數[1]

使用這種方法推導8個數的最少比較次數能夠得出最少須要18次,但仍然不是理論最少的。聽說理論最少的比較次數並不必定能達到。

參考資料

[1]

5個數排序最少比較次數: https://blog.csdn.net/x_i_y_u_e/article/details/45059725?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight


打個廣告

路科驗證V2課程大升級啦,升級後的V2pro,不只保留了本來V2的全部內容,還添加了關於vim、linux、DVT的操做教程,以及寄存器模型自動化,更有定製的個性項目,爲你的簡歷添磚加瓦。若是想要學習SV和UVM,想要入門或者轉行驗證,路科驗證V2pro不容錯過!若是對課程有興趣能夠後臺聯繫我,能夠得到優惠!詳情戳->芯片驗證V2 Pro秋季班報名通道已開啓!更有早鳥報名優惠等着你!!

後臺回覆路科驗證還能夠享受200元優惠!!!歡迎報名~


精彩專輯

備戰秋招專輯

驗證工程師面試攻略專輯

《數字集成電路靜態時序分析基礎》筆記專輯

深刻AXI4總線專輯

UVM實戰專輯

秋招記錄專輯


歡迎轉發、在看、喜歡三連,關注公衆號及時接收推送

我的博客地址:https://www.cnblogs.com/icparadigm/

點擊在看,分享給你的朋友吧👇

本文分享自微信公衆號 - 摸魚範式(icparadigm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索