Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 电话簿应用程序中高效子字符串搜索的数据结构_Algorithm_Data Structures - Fatal编程技术网

Algorithm 电话簿应用程序中高效子字符串搜索的数据结构

Algorithm 电话簿应用程序中高效子字符串搜索的数据结构,algorithm,data-structures,Algorithm,Data Structures,我想在电话簿上存储联系人, 我希望用户只搜索名称的一部分 例如: 电话簿包括: Tom, John, Eve, Barbi ,Johnathon. 现在,用户搜索“hn”,结果需要是“John”和“Johnathon” 我读过关于TRIE的书,但它只适合前缀 感谢大多数人,他们的通讯簿中只有不到1000条条目。您只需依次在每个名称中的子字符串中搜索“hn”即可 例如,在Python中: results = [name for name in address_book if name.cont

我想在电话簿上存储联系人, 我希望用户只搜索名称的一部分

例如: 电话簿包括:

Tom, John, Eve, Barbi ,Johnathon. 
现在,用户搜索“hn”,结果需要是“John”和“Johnathon”

我读过关于TRIE的书,但它只适合前缀


感谢大多数人,他们的通讯簿中只有不到1000条条目。您只需依次在每个名称中的子字符串中搜索“hn”即可

例如,在Python中:

results = [name for name in address_book if name.contains(search_term)]

对于大多数人来说,他们的地址簿中的条目将少于1000条。您只需依次在每个名称中的子字符串中搜索“hn”即可

例如,在Python中:

results = [name for name in address_book if name.contains(search_term)]

如果我开发你的项目,那将是我的解决方案;下面的代码只是伪代码,您可以在每种编程语言中尝试

result;
booklist;
search_keyword;
if(length(search_keyword) == 1) //people generaly types first char of the name to find him/his in their list.
    for i=0 to n //traverse 0 to n
        if(booklist[i][0] == search_keyword[0]) //check first letter with booklist element and search_keyword
            result.push(booklist[i]);

if(length(search_keyword) == 2) //people generaly types first two letter of the name to find him/his in their list.
    for i=0 to n //traverse 0 to n
        if(booklist[i][0] == search_keyword[0] AND booklist[i][1] == search_keyword[1]) //check first letter with booklist element and search_keyword
            result.push(booklist[i]);

if(length(search_keyword) > 2)
    for i=0 to n //traverse 0 to n
        if(booklist[i].contains(search_keyword))
            result.push(booklist[i]);

return result;

在这个算法中,大多数用户将等待O(n)时间复杂度。

如果我开发您的项目,这将是我的解决方案;下面的代码只是伪代码,您可以在每种编程语言中尝试

result;
booklist;
search_keyword;
if(length(search_keyword) == 1) //people generaly types first char of the name to find him/his in their list.
    for i=0 to n //traverse 0 to n
        if(booklist[i][0] == search_keyword[0]) //check first letter with booklist element and search_keyword
            result.push(booklist[i]);

if(length(search_keyword) == 2) //people generaly types first two letter of the name to find him/his in their list.
    for i=0 to n //traverse 0 to n
        if(booklist[i][0] == search_keyword[0] AND booklist[i][1] == search_keyword[1]) //check first letter with booklist element and search_keyword
            result.push(booklist[i]);

if(length(search_keyword) > 2)
    for i=0 to n //traverse 0 to n
        if(booklist[i].contains(search_keyword))
            result.push(booklist[i]);

return result;

在该算法中,大多数用户将等待O(n)时间复杂度。

通常在电话簿中

  • 条目的数量没有那么多

  • 添加/删除/修改条目的频率远低于搜索条目的频率

  • 因此,我建议您维护一个哈希表,将子字符串映射到它们出现的条目列表。修改条目时应修改此哈希表

    例如,假设您添加了一个长度为n的新条目。此条目最多有n2个子字符串。对于每个这样的子串:

  • 如果它不在哈希表中,请添加一个将子字符串映射到空列表的条目

  • 不管它是否在哈希表中,都要将该条目添加到对应于子字符串的列表中(只需确保不要添加两次)


  • 如果有m个单词,最长的单词是n,那么O(mn2)应该足以存储所有的单词。对于一个典型的电话簿,这是很小的。

    在电话簿中,通常

  • 条目的数量没有那么多

  • 添加/删除/修改条目的频率远低于搜索条目的频率

  • 因此,我建议您维护一个哈希表,将子字符串映射到它们出现的条目列表。修改条目时应修改此哈希表

    例如,假设您添加了一个长度为n的新条目。此条目最多有n2个子字符串。对于每个这样的子串:

  • 如果它不在哈希表中,请添加一个将子字符串映射到空列表的条目

  • 不管它是否在哈希表中,都要将该条目添加到对应于子字符串的列表中(只需确保不要添加两次)


  • 如果有m个单词,最长的单词是n,那么O(mn2)应该足以存储所有的单词。对于一个典型的电话簿来说,这是很小的。

    这里与
    java
    c++
    有什么联系?你应该说你愿意投资多少mich编码。你是在寻找一个现成的项目,你可以利用?还是想“自己”开发某样东西?嗨,马提亚,谢谢你的回复。我不寻找一个现成的项目,我只是感兴趣的argorithm来解决这样的问题。你可以连接所有的字符串,并使用一些字符串数据结构,如后缀树或后缀数组的结果字符串,这可能会为你服务。我会选择后缀数组,因为它更容易实现和管理。现在,如果我们连接多个字符串,我们将如何在结果字符串中区分它们?答案是,在连接部分使用一个特殊字符,它不会出现在任何其他字符串中。比如,“hello$world”,这里的$就是这个特殊的字符。这里的
    java
    c++
    之间有什么联系?你应该说你愿意投资多少mich编码。你是在寻找一个现成的项目,你可以利用?还是想“自己”开发某样东西?嗨,马提亚,谢谢你的回复。我不寻找一个现成的项目,我只是感兴趣的argorithm来解决这样的问题。你可以连接所有的字符串,并使用一些字符串数据结构,如后缀树或后缀数组的结果字符串,这可能会为你服务。我会选择后缀数组,因为它更容易实现和管理。现在,如果我们连接多个字符串,我们将如何在结果字符串中区分它们?答案是,在连接部分使用一个特殊字符,它不会出现在任何其他字符串中。比如,“hello$world”,这里的$就是那个特殊的字符。对于这个场景解决方案来说,这是一个直截了当但有效的解决方案。对于这个场景解决方案来说,这是一个直截了当但有效的解决方案。