有效排序算法的实际重要性

时间:2018-04-18 10:46:47

标签: algorithm performance sorting

我一直在四处寻找任何需要排序并且效率很重要的实际应用程序,但却找不到任何东西。

我能找到或想到的唯一例子不需要全部排序(比如查找100个最佳结果或中位数)或排序效率几乎不重要(例如每年排序一次带有学生姓名的电子表格或过去的交易)。

  • 在对网页搜索结果进行排序时,只需要查找和排序几十个排名靠前的结果,而不是所有互联网,因此不需要或不实用经典的排序算法。

  • 在对电子表格进行排序时,如果按照三重支点拉斯维加斯随机快速排序或插入排序对其进行排序几乎不重要。

  • 使用排序数组作为集合或关联数组似乎实际上比使用哈希表效率低。

所以我的问题是:什么是实用的("现实生活")示例,其中需要总排序并且其效率是瓶颈 ?我对comparison sorting的应用程序特别好奇。

更新

我在Steven Skiena的lecture notes中偶然发现了这句话:

  

计算机在排序上花费的时间比其他任何时间都多,历史上25%用于大型机。

通过一些细节,这可以成为我问题的完美答案。我在哪里可以找到此统计信息的来源,最好是有关大型机完成排序的类型和应用的一些详细信息?

2 个答案:

答案 0 :(得分:1)

想象一下,您每天都有银行账户的交易清单(存款和取款)。每天有数百万个帐户和数百万笔交易。每晚,您必须更新帐户以反映这些交易,并计算当天产生的利息,并打印按帐户排序的报告,该报告显示每个帐户的日常活动。

一种方法是按顺序浏览列表,读取事务并更新数据库中的帐户。这会有效,但它有几个缺点,包括:

  1. 如果单个帐户有很多交易,您需要为每笔交易支付检索和更新帐户的费用。考虑到企业帐户每天可能有数千笔交易,这些费用会增加。
  2. 典型的规则是在提款前记录存款,以防止透支。如果账户余额为0,并且交易清单在10美元存款之前提取5美元,系统将在不应该的情况下记录透支。
  3. 在记录完所有交易后,打印报告需要单独扫描数据库。
  4. 这些问题的解决方案是按帐户和类型(首先存款)对交易列表进行排序。然后,更新是一个简单的合并操作。您以帐号顺序读取数据库和事务列表,应用该帐户的任何事务,计算兴趣,打印输出行,并将更新的记录写入数据库。

    结果 比为每个事务执行read-update-write更快,并且它消除了上面列出的问题#2和#3。排序和合并使得更新需要整晚,而更新需要几个小时。

    此外,用于处理大数据的MapReduce(和Hadoop)可以充分利用排序。如果没有高性能排序算法,那些编程模型就不可能实现。

    每当您需要将多个大型数据流合并到单个输出流中(并且这些应用程序很多)时,排序和合并方法很有用。有时候其他技术可能更快,但是烟灰和合并是可靠和耐用的,并且如MapReduce所示,可以很好地扩展。

答案 1 :(得分:1)

在某些图形渲染算法中,需要按照前面的顺序绘制对象。一个很好的例子是透明粒子:它们可能有数十万个,并且由于透明度,传统的深度缓冲不起作用。因此,您需要按照距离相机的距离对这些粒子进行排序,并按照每秒60帧的速度对它们进行排序。

有趣的是,如果粒子的顺序没有太大变化(相对较慢的粒子运动,相机移动很少),那么粒子阵列已经在下一帧中“大部分排序”,并且只是一个简单的冒泡排序或插入排序实际上可以正常工作。但是在创建了许多粒子的帧上,或者摄像机快速移动时,排序性能变得很重要,因为每帧都有很多其他的事情要做。