二进制搜索元组

时间:2017-12-11 21:01:55

标签: 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,因为它永远不会搜索列表的较高部分

1 个答案:

答案 0 :(得分:4)

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

在您的算法版本中,您正在进行直接tuple比较。这意味着tuple需要根据它们的比较规则进行排序,即首先由第一个元素进行排序,并且当结果是不确定时 - 然后是第二个元素。

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

>>> 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]):

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