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

2022-02-15 15:15:44 字數 2151 閱讀 9264

@(數字積體電路基礎)

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

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

乍一看,排序演算法,這不是個演算法題麼,將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個。

只需要5\*2+3\*3 = 19 個比較器。事實上,上面的硬體實現方式就是歸併排序的展開實現,歸併排序演算法如下:

參考:歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2-路歸併。

演算法描述:

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

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

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

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

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

面試題之 常用排序演算法

以下排序預設排序效果是從小到大,待排序序列 3,4,63,4,9,0,1,32,2 基本思想 依次交換相鄰兩個元素,使得大的資料往下沉 或小的資料往上附浮 第一步 比較相鄰的兩個元素,如果前者比後者大,則交換兩元素。否則,不交換。第二步 重複第一步直到最後兩個元素比較完成,此時,最大的元素已經在最後...

1 面試題 排序演算法總結

一 排序 1.冒泡 排序 原生 var arr 5,4,3,2,1 for var i 0 i 第一次迴圈比較輪數 for var j 0 j 第2次迴圈比較次數 if arr j arr j 1 呼叫api 如果呼叫該方法時沒有使用引數,將按字母順序對陣列中的元素進行排序,說得更精確點,是按照字元...

面試題二(高精度演算法)

高精度整數加法 要求實現函式 void add const char num1,const char num2,char result 輸入 num1 字串形式運算元1,如果運算元為負,則num1 0 為符號位 num2 字串形式運算元2,如果運算元為負,則num2 0 為符號位 輸出 result...