【问题标题】:Binary search algorithm with 2 keys for indexing in python用于在 python 中进行索引的具有 2 个键的二进制搜索算法
【发布时间】:2025-12-08 20:20:04
【问题描述】:

在我的应用程序中,我有一个对象字典(散列图)。每个对象都有几个属性,包括“uuid”、“name”和“level”。 uuid 是唯一的唯一字段,用作字典键。我希望能够根据它们的名称按字母升序列出这些对象,如果名称相同,则按数字升序排列。为此,我试图维护一个 uuid 的列表(数组)(因此我不必存储整个对象),我可以简单地遍历列表,在每个特定索引处从 uuid 引用适当的对象。因此,当我将对象添加到字典时,必须更新列表。我正在尝试使用二进制搜索算法首先找到其 uuid 与适当名称匹配的列表的索引,然后匹配适当的级别。我的代码让我很接近,但仍然出现语义错误。这里是。谁能帮我调整一下或指出正确的方向? (为了便于理解,我只给出了伪代码)

min = 0
max = numRecords - 1 #numRecords is the number of objects in the dictionary
mid = 0
while max >= min:
    mid = (min + max) / 2   
    if dict[uuid].name() == dict[list[mid]].name():
        if dict[uuid].level() == dict[list[mid]].level():
            break
        elif dict[uuid].level() < dict[list[mid]].level():
            if mid != 0 and dict[uuid].name() == dict[list[mid - 1]].name():
                max = mid - 1           
            else:
                break
        else:
            if mid != numRecords-1 and dict[uuid].name() == dict[list[mid+1]].name():
                min = mid + 1
            else:
                break
    elif dict[uuid].name() > dict[list[mid]].name():
        min = mid + 1
    else:
        max = mid - 1

list = list[:mid] + [uuid] + list[mid:]

【问题讨论】:

    标签: python-3.x indexing binary-search


    【解决方案1】:

    您可以在Python sortedcontainers module 中使用SortedList 类型。您可以将对象存储为 (name, level, uuid) 的元组,排序列表将自动按排序顺序维护它们。您可以使用 bisect 进行查找。

    例如:

    from sortedcontainers import SortedList
    sl = SortedList((name, value, uuid) for name, value, uuid in data)
    
    # Now iterating sl will list objects in ascending order by name, value, uuid.
    
    # If you want to lookup a particular name:
    
    index = sl.bisect((name,))
    

    因为较短的元组自动比较的长度小于较长的元组,所以 bisect 将返回给定名称的索引(或应插入此类名称的索引)。您也可以按索引从 SortedList 中删除。

    sortedcontainers 模块是纯 Python 和 fast

    【讨论】: