二输入比较器实现排序算法

欢迎你们经过博客浏览个人历史文章,博客园包含了目前为止全部的文章,浏览效果更佳,而且有评论留言功能,有任何问题均可以给我留言,微信后台留言可能回复得不及时。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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索