Algorithm 高效排序算法的实际重要性

Algorithm 高效排序算法的实际重要性,algorithm,performance,sorting,Algorithm,Performance,Sorting,我一直在四处寻找,试图了解任何需要排序的实际应用程序及其效率问题,但找不到任何东西 我能找到或想到的唯一例子要么不需要总排序(比如寻找100个最优秀的结果或中位数),要么排序效率几乎不重要(比如每年排序一次包含学生姓名或过去交易的电子表格) 在对web搜索结果进行排序时,只需要找到几十个排名靠前的结果并进行排序,而不是所有的互联网搜索结果,因此经典的排序算法是不需要的,也不实用 在对电子表格进行排序时,它是按三轴拉斯维加斯随机快速排序还是按插入排序几乎不重要 使用排序数组作为集合或关联数组实际

我一直在四处寻找,试图了解任何需要排序的实际应用程序及其效率问题,但找不到任何东西

我能找到或想到的唯一例子要么不需要总排序(比如寻找100个最优秀的结果或中位数),要么排序效率几乎不重要(比如每年排序一次包含学生姓名或过去交易的电子表格)

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

  • 在对电子表格进行排序时,它是按三轴拉斯维加斯随机快速排序还是按插入排序几乎不重要

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

所以我的问题是:什么是实际(“现实生活”)的例子,其中需要总体排序,而其效率是一个瓶颈?我特别想知道你的申请


更新

我偶然发现了史蒂文·斯基纳的一句话:

计算机花在分类上的时间比其他任何东西都多,历史上25%的时间在大型机上


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

假设您有一个银行账户的每日交易(存款和取款)列表。每天有数以百万计的账户和数以百万计的交易。每晚,您必须更新账户以反映这些交易,计算当天应计利息,并打印一份按账户排序的报告,显示每个账户的日常活动

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

  • 如果单个帐户有多个事务,则您需要为每个事务检索和更新帐户付出代价。考虑到一个商业账户每天可能有数千笔交易,这些成本加起来就是
  • 典型的规则是在取款之前先记录存款,以防止透支。如果一个账户的余额为0,并且交易列表在10美元存款之前有5美元的提款,系统将在不应该的时候记录透支
  • 打印报告需要在记录所有交易后对数据库进行单独扫描
  • 解决这些问题的方法是按帐户和类型对交易列表进行排序(存款优先)。然后,更新是一个简单的合并操作。您按照帐号顺序读取数据库和事务列表,应用该帐户的任何事务,计算利息,打印输出行,并将更新的记录写入数据库

    结果比为每个事务执行读更新写要快得多,并且它消除了我上面概述的问题2和问题3。排序和合并使更新花费一整夜,而更新花费几个小时

    此外,用于处理大数据的(和Hadoop)也很好地利用了排序。如果没有高性能排序算法,这些编程模型根本不可能实现


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

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

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

  • 如果单个帐户有多个事务,则您需要为每个事务检索和更新帐户付出代价。考虑到一个商业账户每天可能有数千笔交易,这些成本加起来就是
  • 典型的规则是在取款之前先记录存款,以防止透支。如果一个账户的余额为0,并且交易列表在10美元存款之前有5美元的提款,系统将在不应该的时候记录透支
  • 打印报告需要在记录所有交易后对数据库进行单独扫描
  • 解决这些问题的方法是按帐户和类型对交易列表进行排序(存款优先)。然后,更新是一个简单的合并操作。您按照帐号顺序读取数据库和事务列表,应用该帐户的任何事务,计算利息,打印输出行,并将更新的记录写入数据库

    结果比为每个事务执行读更新写要快得多,并且它消除了我上面概述的问题2和问题3。排序和合并使更新花费一整夜,而更新花费几个小时

    此外,用于处理大数据的(和Hadoop)也很好地利用了排序。如果没有高性能排序算法,这些编程模型根本不可能实现

    当您需要将多个大型数据流合并为单个输出流时(这些应用程序非常多)