搜索和排序大型数据集

时间:2015-02-23 03:02:27

标签: algorithm sorting data-structures

我一直在为访谈练习一些算法问题,偶然发现了与排序来自无限流的数据相关的各种问题,并设计了一个数据结构来搜索数十亿条记录

  
      
  1. 描述如何从无限流中一次一个地读取整数

  2.   
  3. 搜索大量元素是一个搜索空间。 I.E.您被要求设计存储结构和搜索算法   搜索1000亿条数据记录。你可以拥有多个   服务器和多线程。

  4.   

以下是我的想法,如果我错了或者有更好的解决方案,请纠正我

  1. 对于排序整数从无限流中一次读取一个,我们可以使用插入排序吗?最糟糕的插入排序是O(n2)来排序未排序的列表,但在这种情况下,运行时间可以降低到O(logn)。当要将新元素插入已经排序的流中时,我们可以只对新元素执行二进制搜索并在logn时间插入它。但是我们需要将所有项目向右移动1,这将导致O(N)。 我仍然不确定这是否正确

  2. 我们会使用一个平衡的BST,它最糟糕的情况是插入和搜索为logN,或者我们可以使用一个HashMap,理想情况下在O(1)中执行查找并在O(1)中插入。然而,由于我们正在处理1000亿条记录,因此我们对HashMap的最坏情况查找将是O(N),其中包含链接列表实现。

  3. 我仍然没有对这些问题有明确的答案。如果有人可以提供更多的见解,那就太棒了!

    谢谢!

1 个答案:

答案 0 :(得分:4)

对于大量数据的排序,通常分两步进行:

  1. 缓冲区数据,直到您收到一些(通常非常大)数据项为止。然后对它们进行排序并将已排序的块写入磁盘。在收到并整理所有数据之前,您将继续这样做。
  2. 在对所有块进行排序后,对已排序的块进行k方式合并以创建单个排序文件。
  3. 如果你有足够的马力,缓冲和分类可以并行完成。当接收到每个块时,在主线程继续接收新块中的数据时,启动线程对其进行排序。当然,这不是无限可扩展的,因为对大型缓冲区进行排序所需的时间比接收时要长得多。因此,您可能必须在收到磁盘时将每个块写入磁盘,并且具有固定数量的后台线程来对这些块进行排序。基本算法是相同的,但是......只是稍微延迟了一段时间。

    如果您可以使用多台计算机进行搜索,则通常会在众多计算机之间传播数据。因此,如果你有4台机器,每台机器获得1/4的数据。当您想要进行搜索时,您可以让每台机器搜索其数据集以匹配记录,并将这些结果传达给某个中心位置,从而对重复项进行排序和删除。

    现在,如果您想要从潜在的无限流中维护一个已排序的数据结构(即能够在接收数据时随时搜索​​),那么您需要更具动态性的内容。一种简单的方法是使用主排序结构,以及“尚未排序”的缓冲区。因此,例如,假设您已经收到了已经分类和存储的十亿个项目,并且您的缓冲区大小为100万个项目。收到数据后,在将它们与主数据结构合并之前,会在内存中存储一​​百万个项目。

    当您收到搜索查询时,搜索主结构,如果您使用二进制搜索,则该结构将为O(日志N),然后您按顺序搜索接收缓冲区。假设顺序搜索有点慢,因为它是顺序的,但所有数据都在内存中,因此您不必支付I / O的费用。

    当缓冲区填满时,您使用有效的算法将其与存储的结构合并。

    这是基本的想法。有许多方法可以通过多级合并来提高效率,或者使用比二叉树或类似物更好的数据结构。