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

Algorithm 在排序和旋转的列表中插入元素,algorithm,list,insert,sorting,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可以作为第一个/最后一个元素插入。考虑边界条件,例如-待

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

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可以作为第一个/最后一个元素插入。考虑边界条件,例如-待插入元素,第一个元素和最后一个元素的值相同。

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

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

我提出的解决方案之一

1.检查边界条件,如

  • 如果新元素是b/w第一个和最后一个元素,反之亦然
  • 如果新元素等于第一个或最后一个元素
如果满足上述任何条件,则首先插入元件

2.以中间元素为例

  • 检查新元素是否=中间元素-在此位置插入新元素
  • 检查新元素是否为b/w中间元素和最右边的是否为b/w最左边和最右边的元素
3.根据上述条件计算元素b/w左中右中的个数


  • 如果元素的数量,那么真正的问题当然是关于所需的数据结构和效率

    • 顺序是什么(升序/降序)
    • “最低限度”在哪里
    请注意,您需要了解订购情况,否则
    4,2
    可能被解释为:

    • 2,4
      上升并旋转一次
    • 4,2
      降序
    从3个元素中,您可以猜到
    4,2,3
    是升序和旋转一次,这是因为最大值和最小值是一起设置的

    实际上,您可能应该使用圆形结构,这将使旋转更容易。然后,您可以维护此结构的访问器:

    • 哪一个指向最小值
    • 哪个指向当前的开始
    在给定最小值的情况下,很容易(与右边的邻居进行一次比较)知道排序是什么。从那时起,插入到循环结构中也很容易。

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

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


    首先选择中间的元素(假设为12)。12小于51,因此最大的元素位于12的左侧。你把间歇时间一分为二,得到54分。54大于51,因此最大元素介于54和12之间。等等

    请解释如何通过二进制搜索从列表中获取
    59
    ;在由n-1个零和1个一组成的输入中,很难找到一个。为什么第二次插入需要O(logn)时间?如果插入必须在数组的开始处,那么你必须将每个元素移到另一个位置,花费N次你是对的——在我的解决方案中,我实际上是在解零件以找到元素(或插入元素的位置)。如果插入需要O(N),那么这个问题当然不能比O(N)更快地解决,而O(N)的解决方案是微不足道的。它是链表(不可能随机访问)还是数组(可能随机访问)?这个问题假设你不是进行旋转的人:)@Olexiy:True。但治疗病因往往比治疗症状好;)