在已排序和旋转的列表中插入元素

时间:2010-02-19 07:59:27

标签: algorithm list insert sorting

给出了已排序和旋转元素的列表。元素按升序或降序顺序排序。例如 - 我列出了已排序的元素,如下所示

10,12,14,16,18,20,51,53,54,59

现在这个列表旋转了X次,然后看起来如下。

51,53,54,59,10,12,14,16,18,20

如果要在此列表中插入元素,那么最有效的方法是什么。

对于要插入的元素是13,如果以线性方式遍历列表,则错误插入可能发生在59到10之间。

我不期待任何代码,而是对算法的讨论是我期待的。 值21可以作为第一个/最后一个元素插入。考虑边界条件,例如 - 要插入元素,第一个和最后一个元素具有相同的值。

5 个答案:

答案 0 :(得分:3)

这可以在log(N)时间内解决。简而言之:

  1. 使用二进制搜索查找列表中最大/最小的元素。这需要O(logN)。只需将您正在查看的元素与列表的第一个元素进行比较即可轻松实现。
  2. 使用二进制搜索插入新元素,仅使用列表的必要部分。这也需要O(logN)。
  3. 关于第1点的更多信息: 假设您需要找到51,53,54,59,10,12,14,16,18,20中最大的元素。

    首先你选择中间元素(假设它是12)。 12小于51,因此最大元素在12的左边。你将间隔分成两半,得到54. 54大于51,因此最大元素在54和12之间。依此类推

答案 1 :(得分:2)

当然,真正的问题是所需的数据结构和效率。

  • 什么是排序(升序/降序)
  • “最低”
  • 在哪里

请注意,您需要了解排序,否则4,2可以解释为:

  • 2,4上升并旋转一次
  • 4,2降序

从3个元素中,您可以猜测4,2,3是上升和旋转一次,因为最大值和最小值一起设置。

实际上,您应该使用循环结构,这将使旋转变得容易。然后,您可以维护此结构的访问器:

  • 指向最低
  • 指向当前的开头

给定最小值,很容易(与右手邻居比较)知道排序是什么。从那时起,插入圆形结构也很容易。

答案 2 :(得分:1)

跟踪X'旋转'期间的最小元素。然后在相关的一半使用二进制搜索。

答案 3 :(得分:1)

假设您的列表允许有效的随机访问,这是一个带偏移的二分搜索。如果找到了正确的索引,则将元素1索引位置向左移动。这具有搜索的复杂度O(log n)和列表复制操作的O(n)。

答案 4 :(得分:0)

我提出的一个解决方案,

1.检查边界条件,例如

  • 如果新元素是b / w第一个和最后一个元素,反之亦然
  • 如果新元素等于第一个或最后一个元素

如果满足上述任何条件,请在第一位插入元素。

2.取中间元素

  • 检查新元素==中间元素 - 在此位置插入新元素
  • 检查新元素是否是b / w中间元素和最右边 OR 它是b / w最左边和最右边的元素。

3.元素的计算数量b / w左 - 中 OR 中右 - 基于上述条件。

  • 如果元素数量为< = 2,则插入新元素b / w Left-Middle OR Right-Middle
  • 否则计算新的Left,Middle和Right元素并执行第2步。