【问题标题】:Most efficient method to sort on the fly [duplicate]最有效的动态排序方法[重复]
【发布时间】:2012-01-19 08:43:37
【问题描述】:

可能重复:
how to sort data at the time of adding it, not later?

我需要即时对数据进行排序。基本上我有一个数组,其中将插入元素。每次插入后,应对数据进行排序。实现这一目标的最快方法是什么?

【问题讨论】:

  • 根据您尝试排序的数据,可能会有不同的方法。那么你想排序什么呢?
  • 在每次插入一个元素或多个元素之后?
  • 另一个问题是你想要的数据是什么?什么是访问模式:您是否只想按排名“索引”它们?是否应该允许删除,甚至允许更新

标签: c sorting data-structures


【解决方案1】:

实现这一点的最快方法是删除数组并使用二叉​​搜索树代替 O(lg n) 排序插入。使用数组时,由于需要平均移动 n/2 个元素,您将始终被线性时间插入所困扰。

编辑:您也可以使用heap 代替BST;可以用数组来实现。但是,对于二叉堆,迭代需要 O(n lg n),而在 threaded BST 中可以在 O(n) 时间与 O(1) 额外内存。

【讨论】:

  • 这在一般情况下可能是正确的,但在特定情况下可以获得更好的性能。例如,当输入包含有限的整数值时,您可以使用 bucket-sort
  • 我同意;本质上排序的结构(像 B 树等的插入排序或迭代排序,想不出一个例子)必须是要走的路。
  • @MattyK:可以通过堆来实现迭代排序。
【解决方案2】:

如果在每次插入后对数组进行排序,那么执行此操作的最快方法是使用二分搜索算法来查找应该插入元素的位置,并将所有元素从该位置开始向下移动一个, 并将元素插入到您创建的间隙中。

也就是说,如果可以的话,使用 BST 确实会更好,正如 larsmans 所说。这样您就可以避免每次插入一个元素时都必须移动所有元素。

【讨论】:

  • 第一段也是我在想的:-)。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多