或者说,现在有一堆字符串(数量约 1000 ),随意给定前几个字符,例如"abc",要求找出所有以"abc"开头的字符串。
要实现成一个函数,因为调用的频繁,所以要考虑性能。
具体应用场合大家可以回想 vim 状态栏按冒号然后上 /下翻找历史命令时,它会根据已输入的补全。
我目前想到两个方法,方法一:
把这些字符串排序存储。例如排序成这样:
abc
abcd
bcd
bce
bceaaa
begggggg
c
df
排序算法是:按首字母逐渐往后比较。
查找方法是简单的线性查找
再跟大家确认一下函数的功能,例如:
接受"ab",要返回"abc", "abcd";
接受“ bce",要返回"bce","bceaaa";
方法二:
设置 10 个哈希表,对所有字符串手动做 hash,从第一个字母开始,hash 算法每推进一个字符,就把当前的 hash 值存到对应的哈希表。
这样,以后查找"abc"时,直接从第三个("abc"的 strlen 是 3)哈希表取出 hash 值对应"abc"的所有字符串,再做一下 strncmp()就行了。
设置了 10 个哈希表,如果 10 个以后还区分不出,就另行存储,按方法 1 对待。
各位有什么更好的,或更简单的方法,或者建议?希望能在这里交流一下。
要实现成一个函数,因为调用的频繁,所以要考虑性能。
具体应用场合大家可以回想 vim 状态栏按冒号然后上 /下翻找历史命令时,它会根据已输入的补全。
我目前想到两个方法,方法一:
把这些字符串排序存储。例如排序成这样:
abc
abcd
bcd
bce
bceaaa
begggggg
c
df
排序算法是:按首字母逐渐往后比较。
查找方法是简单的线性查找
再跟大家确认一下函数的功能,例如:
接受"ab",要返回"abc", "abcd";
接受“ bce",要返回"bce","bceaaa";
方法二:
设置 10 个哈希表,对所有字符串手动做 hash,从第一个字母开始,hash 算法每推进一个字符,就把当前的 hash 值存到对应的哈希表。
这样,以后查找"abc"时,直接从第三个("abc"的 strlen 是 3)哈希表取出 hash 值对应"abc"的所有字符串,再做一下 strncmp()就行了。
设置了 10 个哈希表,如果 10 个以后还区分不出,就另行存储,按方法 1 对待。
各位有什么更好的,或更简单的方法,或者建议?希望能在这里交流一下。

