【问题标题】:Which Data structure to use to sort millions of records and what algorithm to use使用哪种数据结构对数百万条记录进行排序以及使用哪种算法
【发布时间】:2018-10-17 15:48:51
【问题描述】:

我有一种情况,我必须存储数百万条记录。同时,我还需要对这些记录进行排序。我有以下问题。

  1. 使用哪种数据结构来保存如此大量的记录?
  2. 我应该使用哪种排序算法对上述选定数据结构上的记录进行排序?
  3. 我应该在添加时对数据进行排序,还是在需要时继续添加和排序?
  4. 数以百万计的记录都是 ff 类型的原语和对象。所以我需要对存储在两种不同数据结构中的两种类型的记录进行排序。

当有人问我百万记录中第 n 个最小/第 n 个最大的数据时,我需要从排序的数据中返回数据。我需要将此数据存储在内存中。

我确实试图找到答案,但找不到任何具体的东西。任何帮助表示赞赏?

【问题讨论】:

  • 只需使用数据库,它总是比您自己的解决方案更好,并且您将免费获得数据的持久性。
  • 这些问题的答案实际上取决于您实际上想要对这些数据执行的操作 - 您想要对数据执行的所有操作,以及您想要执行的每个操作相对于彼此的时间,这些操作的相对频率等。
  • 您说您必须存储数百万条记录。你的意思是存储在磁盘上?还是您只需要将它们保存在内存中?正如@moreON 所说,您如何执行此操作取决于您将如何处理数据。如果没有更具体的信息,这个问题就太宽泛了,可能不会得到好的答案。
  • 是的,我想在内存中存储数百万条记录。当有人问我第 300 个最小数据或第 10000 个最小数据时,我需要从排序后的数据中返回数据
  • 如果您只想找到第 n 个最大或第 n 个最小的,则只需将记录加载到数组中,然后使用运行时库的标准排序函数对数组进行排序。然后查找成为数组的直接索引。不过,不知何故,我认为你并没有告诉我们整个故事。您是否一次获得所有记录?或者是否经常添加和/或删除记录?什么是“ff 类型原语”?如果您想要一个好的答案,您需要向我们提供有关数据以及数据收集和使用方式的更多信息。

标签: sorting data-structures collections


【解决方案1】:

地图是您可以使用的数据结构。它以排序方式存储数据。它将数据存储在可以使用键访问的(键,值)对中。

在不同的编程语言中,您可以看到它们的核心库已经内置了映射,或者更确切地说是哈希映射,它们在每个实现中可能具有不同的名称。

  1. Map是java中的一个接口,它的具体实现叫做HashMaps和Hashtables。

  2. Python - 字典

  3. C++ - hash_map、unordered_map 等是不同的实现

哈希映射是使用数组实现的。这个想法是在数学上将键转换为在我们数组大小范围内的数值(称为哈希),并将值存储在数组中的该索引处。当您从表中添加或删除元素时,您可以分别减小或增加数组的大小。对于不同的键,这个散列函数的范围可能不同。散列函数的几个例子是:

  1. Integers Keys : 将键与表(数组)的大小进行修改以获得唯一键。

  2. String Keys : 取字符串中字符的 ASCII 值,将它们相加并根据表格的大小进行修改。

解决冲突 - 很自然,您可能会遇到 2 个或更多键散列到表中的同一位置(索引)的情况。你可以使用不同的方法来解决这个问题。一些众所周知的技术是线性探测或分离链接。例如,单独的链接只不过是在每个索引处存储一个链表。该列表的一个节点将存储(键,值)对。因此,所有哈希到同一个索引的键都将存储在同一个链表中。

哈希映射的许多实际应用是因为它在插入数据、搜索数据和删除数据这三件事上的效率!它们广泛用于构建其他复杂的系统、组件或数据结构,如缓存(LRU 缓存)、数据库索引、集合等。

【讨论】:

  • 那么您的意思是创建一个地图,将其转换为树形图进行排序?
  • 如果你使用数组映射,那么就不会有排序,但如果你确实使用树状图,比如 C++ 中的内置定义库,那么排序可以很容易地完成,你也可以使用键来访问记录直接
  • 您对如何将字符串键转换为哈希表索引的想法是错误的。使用散列函数对字符串键进行散列处理,这比仅将 ASCII 值相加要复杂得多。您应该熟悉Hashing functions。此外,您关于地图已排序的断言是不正确的。虽然排序地图是可能的,但这不是典型的实现。最后,哈希映射对于搜索并不是特别好。它们适用于 查找,这与搜索大不相同。
  • 我同意你的观点,最好是查找而不是搜索。还有其他更擅长搜索的数据结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 2017-10-27
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多