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


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

@(數字集成電路基礎)

1. 問題描述

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

(距離面試已經過了很久,抽空整理一下當時的題目)

2. 問題解析

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

這樣排完以后要解決的問題就是組間的大小問題。首先,兩組之間最大的比較一下就能出來四個中最大的,兩組最小的比較出來四個中最小的。所以第二級比較又需要兩個比較器。第二級結束后我們已經得到了最大和最小,但次大和次小還不能確定,所以需要一個額外的比較器確定次大次小。
所以四個數的排序電路如下:

所以4個數進行排序需要的最少的二輸入比較器個數是5個。
那么現在問題回到8個數,實際上我們相當於已經有了4輸入進行排序的模塊,用若干個4輸入排序模塊來完成8輸入排序。相對於二輸入模塊,四輸入的模塊的輸出可以分為兩組,一組最大次大,另一組最小次小。實際上還是按照剛才的拓撲結構,將二輸入換成四輸入即可:

還是按照之前的思路,首先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輸入模塊中的后三個二輸入比較器,因為這幾級的輸入大小關系已經確定,更改后的拓撲圖如下:

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

3. 延伸思考

事實上,上面的硬件實現方式就是歸並排序的展開實現,歸並排序算法如下:
參考:https://www.cnblogs.com/onepixel/articles/7674659.html

歸並排序是建立在歸並操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合並成一個有序表,稱為2-路歸並。
算法描述:

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

enter image description herehttps://images2017.cnblogs.com/blog/849589/201710/849589-20171015230557043-37375010.gif

再想一下,這一題最本質的問題其實是:
給定n個數的排序,最少需要的比較次數是多少?
如果從信息論的角度來看,n個數的排序總共有\(A_n^n=n!\)種情況,對應的信息量就是\(log_2(\frac{1}{n!})\),而一次比較獲得的信息量\(log_2(\frac{1}{2})\).所以理論的最少比較次數就是:\(log_2(\frac{1}{n!})/log_2(\frac{1}{2}) = log_2(n!)\)。可以發現當n=4時,理論比較次數為\(log_212\), 向上取整就是5,跟我們的電路中用到的比較器個數相同。但是當n=8時,理論的最少比較次數是\(log_28! =15.3\),也就是需要16次比較。那為什么我們這里用到了25個比較器呢?實際上這是因為題目限制了我們只能使用比較器,而要實現理論最小的比較次數還需要其他邏輯的支持,比如MUX。所以上述19個比較器只是歸並排序算法的一種硬件實現方式,但並不一定是比較次數最少的硬件實現方式(考慮使用其他邏輯的話)。

PS: 5個數排序的理論最少排序次數(7)的一種比較邏輯:5個數排序最少比較次數
使用這種方法推導8個數的最少比較次數可以得出最少需要18次,但仍然不是理論最少的。據說理論最少的比較次數並不一定能達到。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM