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第一个和最后一个元素,反之亦然
- 如果新元素等于第一个或最后一个元素
- 检查新元素是否=中间元素-在此位置插入新元素
- 检查新元素是否为b/w中间元素和最右边的或是否为b/w最左边和最右边的元素
- 如果元素的数量,那么真正的问题当然是关于所需的数据结构和效率
- 顺序是什么(升序/降序)
- “最低限度”在哪里
可能被解释为:4,2
上升并旋转一次2,4
降序4,2
是升序和旋转一次,这是因为最大值和最小值是一起设置的 实际上,您可能应该使用圆形结构,这将使旋转更容易。然后,您可以维护此结构的访问器:4,2,3
- 哪一个指向最小值
- 哪个指向当前的开始
- 使用二进制搜索查找列表中最大/最小的元素。这需要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。但治疗病因往往比治疗症状好;)