如何解决有偏二元排序返回插入的第一个索引
我正在尝试设法返回第一个可能的位置,我可以在其中在递增列表中插入新术语。我的一般尝试是使用二进制排序,直到出现前一项小于我的插入项,而下一项等于或大于我的插入项的条件:
lis = [1,1,2,4,5,6,7,8,9]
def binary_sort(elem,lis,left,right):
mid = (left + right)//2
if (lis[mid-1] < elem and elem <= lis[mid]):
return mid
elif (lis[mid] > mid):
return binary_sort(elem,mid,right)
else:
return binary_sort(elem,mid)
这不起作用...我的代码或我的总体策略有什么问题?
解决方法
我建议看看下面的代码。
def binary_insertion_search(elem,items,left,right):
if elem > items[right]:
return right + 1
while left < right:
mid = (left + right) // 2
if elem > items[mid]:
left = mid + 1
elif elem <= items[mid]:
right = mid
return left
我稍微重写了你的函数。现在解释:
我假设要返回的索引是可以放置任何内容的第一个位置,这反过来会将所有后续项目向右移动。
由于设计上我们无法合并列表范围之外的索引,因此我们必须检查元素是否大于列表末尾的项目。然后我们返回下一个可能的索引 len(lis)
。
为了避免递归,我使用了一个while循环。首先,我们检查 left
是否等于或大于 right
。这只能是正确的,如果我们已经找到了放置元素的索引。
您对 mid
值的计算很好,所以我保留了它。
如果我们的元素大于 mid
处的项目,唯一可能的下一个选项是选择下一个 未选中位置,即 mid + 1
。
现在是有趣的部分。与其他情况一样,要找到最左边的项目,我们必须将 right
边界设置为 mid - 1
,以便跳过 mid
元素。但是,我们会检查元素是否小于或等于 mid
处的项目。
这保证了当我们找到与搜索元素相等的候选元素时,我们再次运行搜索(从右开始缩小范围)以可能找到更小的索引。这会停止,当 left == right
为真时,结束循环。
我希望这能回答您的问题并指出代码中的差异!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。