【问题标题】:What would be the fastest way to sort an array of people by age?按年龄对一组人进行排序的最快方法是什么?
【发布时间】:2012-10-28 22:36:23
【问题描述】:

有一个结构数组

struct
{
string name;
string 2nd_name;
int age; // 0 to 150
}

数组的最大长度为 10^8。

我知道我可以使用归并排序/快速排序和所有其他众所周知的算法,但是我想知道是否可以添加其他东西来加速排序。

【问题讨论】:

标签: algorithm sorting


【解决方案1】:

人们的年龄与用于排序的任意整数有些不同:它具有极少数可能的不同值(所有人的年龄都在 0 到 150 之间)。所以最快的排序方法是分配151个链表(我们称之为桶),并根据每个人的年龄将其数据结构放入桶中:

bucket[person->age].add(person)

【讨论】:

  • (计数排序确实是通用实现)
  • 我不相信这比一个好的快速排序实现更快。链表有开销,150 > log2(10^8).
  • @IVlad 链表具有恒定的开销。数组列表具有更好的开销。
【解决方案2】:

首先,请注意,即使结构非常大(即长名称),您也不需要使用文件系统排序,您可以使用内存排序,因为

# elements * 8 ~= 762 MB (most modern systems have enough memory for that)
             ^
        key(age) + pointer to struct requires 8 bytes in 32 bits system

尽量减少磁盘访问很重要 - 因为磁盘不是随机访问,而且磁盘访问比 RAM 访问慢得多。

现在,使用您选择的排序方式 - 并避免使用磁盘进行排序。

这种情况下(在 RAM 上)的一些可能性是:

  • 标准快速排序或合并排序
  • Bucket sort也可以用在这里,因为怒气限制在[0,150]
  • Radix sort(出于同样的原因,基数排序需要 ceil(log_2(150)) ~= 8 次迭代

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 2017-12-31
    • 1970-01-01
    • 2015-09-16
    • 2011-10-14
    • 1970-01-01
    • 2021-03-19
    • 2021-08-28
    相关资源
    最近更新 更多