python - 元组的二分查找

标签 python recursion binary-search-tree

我正在尝试编写一个代码,使用二分搜索将元组与其中的 2 个值(姓名、姓氏)进行比较

names = [('Josh', 'Belluga'), ('Daisy', 'Fox'), ('Elin', 'Grosefield'), ('Dina', 'Ram'), ('Mike', 'Levinsan')]

二分搜索代码获取排序列表

def find_name(lst,name,low,high):
    if name == lst[high]:
        return high
    if name == lst[low]:
        return low
    if low >= high:
        return None
    middle = (low + high) / 2
    if lst[middle] == name:
        return middle
    **if lst[middle] > name:**
        return find_name(lst, name, low, middle)

    return find_name(lst, name, middle + 1,high)

出于某种原因,我放置 ** 的部分总是给我值 true,因此它永远不会搜索列表的较高部分

最佳答案

要使二分搜索正常工作,您的项目需要正确排序。

在您的算法版本中,您正在执行直接元组比较。这意味着元组需要根据其比较规则进行排序,即首先按第一个元素排序,然后(当结果不确定时)按第二个元素排序。

如果您在此列表中尝试您的算法,您会发现它有效:

>>> list(sorted(names))
[('Daisy', 'Fox'), ('Dina', 'Ram'), ('Elin', 'Grosefield'), ('Josh', 'Belluga'), ('Mike', 'Levinsan')]

如果您想让列表按姓氏排序,您首先需要将 ('Mike', 'Levinsan') 放在正确的位置。结果应该是:

>>> list(sorted(names, key=lambda x: (x[1], x[0])))
[('Josh', 'Belluga'), ('Daisy', 'Fox'), ('Elin', 'Grosefield'), ('Mike', 'Levinsan'), ('Dina', 'Ram')]

接下来,您需要更改算法中的这一行:

if lst[middle] > name:

类似:

if (lst[middle][1], lst[middle][0]) > (name[1], name[0]):

这样您就可以在比较名字之前比较姓氏。

关于python - 元组的二分查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47761340/

相关文章:

python - Trackpy DriftPredict 漂移参数

Python headless MatplotLib/Pyplot

python - 如何断言模拟是用特定类型而不是实例调用的?

java - 使用递归方法在两个字符串之间第一个不同字符的索引

performance - 在二叉搜索树中,Big O 的日志的基础是什么

python - 当我将带有 self 引用的列表分配给带有切片语法 `mylist[:] = [mylist, mylist, ...]` 的列表副本时,会发生什么?

java - 递归归并排序仅对数组的一半进行排序

javascript - 简单的数组递归而不是 while

c++ - 插入二叉搜索树

java - 添加数据时出现 NullPointerException - Java