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