繁体   English   中英

将查询与已知列表匹配,根据字典顺序显示结果的算法

[英]Algorithm to match query to known list, presenting result based on lexicographic order

我正在设计一种算法,以在给定查询的列表中查找字符串,并返回列表中与查询匹配的任何字符串。 这是根据字典顺序的第一个匹配来回答的。 如果查询为空字符串,则返回空字符串;如果查询不是已知列表中任何项开头的内容,则返回-1 到目前为止,这是我的算法。 有什么方法可以修改算法,使其运行速度更快?

输入示例:

usernames: ["jBlame", "jannet"]
queries: ["j", "jm", "jbl", "JB"]

示例输出:

jannet
-1
jBlame
jBlame

这是我当前的实现。 我一直在绞尽脑汁,试图找到一种提高此代码速度的方法,但我没有找到一种方法。

def name_finder(usernames, queries):
    users = sorted(usernames,key=lambda m:m.upper())
    for q in queries:
        if q=='':
            print ''
            break
        for user in users:
            if q.upper()==user.upper()[:len(q)]: 
                print user
                break
        else: print -1

时间上进行权衡 首先建立索引,这会花费更多的空间和时间。 使用该索引进行查询,然后每个find_name()调用都会获得O(1)时间复杂度的好处。

usernames = ["jBlame", "jannet"]
queries = ["j", "jm", "jbl", "JB"]

def build_index(usernames):
    """Build an index by given usernames

    :returns: index dict
    """
    result = {}
    # Sort should ignore cases
    for username in sorted(usernames, key=lambda x: x.lower()):
        for i in range(len(username)):
            # TODO: If you only want the first result matched, modify this line to 
            # let the index consumes less space
            result.setdefault(username[:(i + 1)].lower(), []).append(username)
    return result


def find_name(query, index):
    """return the matched username by given query and index
    """
    if not query:
        return ''
    result = index.get(query.lower())
    return result[0] if result else -1

index = build_index(usernames)
for query in queries:
    print find_name(query, index)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM