先提一个简单的问题,如果有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做?
有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止。
代码如下:
public class hash {
public static boolean equals(String str1,String str2){
int length1 = str1.length();
int length2 = str2.length();
if(length1 != length2){
return false;
}else{
for(int i = 0;i < length1;i++){
if(str1.charAt(i)!=str2.charAt(i)){
return false;
}
}
}
return true;
}
public static void main(String[] args) {
String[] data = {"hello","love","good","eat","eye"};
//查找good
String s = "good";
for(String str:data){
if(equals(s,str)){
System.out.println("存在:"+s);
}
}
}
}
这个算法复杂程度为:词库单词个数 m*比较单词时间n。如果词库中有一半与要检索的词长度一样。那么比较单词的时间n就是要检索的的词长度*m/2
整个程序时间就是 (要检索的的词长度*m*m)/2
也可以利用哈希算法来检索
代码如下:
public class hash {
//哈希函数
public static int Hash(int key){
return key%5;
}
public static int HashCode(char[] str,int len){
int h = 0;
for (int i = 0; i < len; i++) {
h = h* 33 + str[i];
}
return h;
}
public static void main(String[] args) {
String[] data = {"hello","love","good","eat","eye"};
String[] hashtable = new String[5];
int i = 0;
for(String s:data){
int code = HashCode(s.toCharArray(),s.length());
hashtable[Hash(code)] = s;
}
//查找good
String var = "good";
int code = HashCode(var.toCharArray(),var.length());
if(hashtable[Hash(code)]!=null){
System.out.println("存在:"+var);
}
}
}
这个算法复杂程度:词库单词个数m*词库单词平均长度n
当词库非常大时,相对于之前的算法,效率有很大的提高。
分享到:
相关推荐
字符串哈希算法是计算机科学中的一种基础算法,广泛应用于数据存储、检索、加密等领域。在本文中,我们介绍了一些主流的字符串哈希算法,并提供了实例代码。这些算法可以帮助开发者更好地处理字符串数据,并提高系统...
在C语言环境下,哈希算法的实现通常涉及到自定义的数据结构和函数,以便将任意长度的输入(键或字符串)转化为固定长度的输出,这个输出就是哈希值。哈希值应具有一定的唯一性,使得输入数据通过哈希函数映射到有限...
- **One-Way Hash**:暴雪哈希算法的一个显著特点是其单向性,即从哈希值反推原始字符串几乎是不可能的。 - **高效率**:由于算法采用了位运算和简单的加法操作,因此其执行速度非常快。 - **低冲突率**:通过对...
常见的做法是取指纹矩阵的左上角64位(8x8矩阵的一半),然后将其转换为一个16进制的哈希字符串。 在Android开发中,可以使用第三方库如`aphash`或者自定义实现来应用感知哈希算法。当需要检测大量图片是否重复时,...
PWW哈希算法则是其中一种优化的实现,其全称可能是“Patricia Trie with Weighing”或类似的变体,这暗示了它可能结合了Patricia Trie(一种高效的字符串查找数据结构)和特定的权重策略来提升性能。 “完善后发布...
字典树是一种树形结构,用来存储字符串集合,特别适用于实现字符串的快速检索、插入和删除等操作。字典树的每个节点包含若干个指向子节点的指针,一般用于存储字符串的字符。AC自动机,又称为Aho-Corasick自动机,是...
5. **哈希化**:将二进制表示转换为一个哈希值,通常是一个较短的字符串。 在Python中,`imagehash`库提供了便捷的接口来实现这些操作。例如,可以使用`imagehash.phash()`方法创建一个感知哈希对象,然后使用`...
哈希函数的作用是将关键字(通常为字符串)转换为数组的索引,以便在数组中存储或查找对应的元素。一个好的哈希函数应该具备以下特点: 1. **均匀性**:哈希函数应尽可能使得不同的关键字映射到数组的不同位置,减少...
6. **Trie(字典树)**:Trie是一种前缀树结构,用于高效地存储和检索字符串集合。每个节点代表一个字符串前缀,从根节点到某个节点的路径表示一个完整的字符串。Trie常用于关键词搜索、自动补全等功能。 7. **...
10. 实际应用场景:在实际应用场景中,需要考虑到哈希算法的实际应用需求,例如数据存储、数据检索、身份验证等等。 哈希算法的实现需要考虑到多个因素,包括哈希函数的选择和实现方式、数据结构的选择、安全性问题...
以上就是均值哈希算法在MATLAB中的应用流程,这种方法的优点在于其简单和高效,适用于大规模图像检索。然而,由于其简化的特性,可能会丢失一些细节信息,导致某些视觉上相似但哈希码不同的情况。为了提高检索效果,...
该函数接收两个字符串参数,分别作为键(key)和值(value),并在控制台上显示插入的信息。 ##### 3. 计算哈希值 在`main()`函数中,计算哈希值的逻辑如下: ```cpp int an = 0; int bn = (int)key.length(); for(int ...
在VC++编程环境中,快速检索和匹配字符串是常见的任务,特别是在处理大量文本数据时效率尤为重要。以下是一些关于如何在VC++中实现高效字符串搜索的关键知识点: 1. **字符串基本操作**:首先,理解C++标准库中的`...
在编程领域,字符串的相似度计算是一个常见的任务,特别是在文本处理、信息检索和自然语言处理中。本篇文章将深入探讨如何在Delphi环境下计算字符串的相似度,以及相关的技术细节。 Delphi是一种基于Object Pascal...
9. **Rabin-Karp算法**:另一种字符串匹配算法,使用哈希函数加速查找过程。 10. **Manacher's Algorithm**:处理回文字符串的高效算法,可以在O(n)时间内找到最长回文子串。 11. **动态规划(DP)**:在字符串...
它不仅支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,还具备持久化功能,能够将内存中的数据保存到磁盘上,保证数据的持久化存储。结合改进的一致性哈希算法,可以使得Redis在分布式环境下更加高效地...
常见的字符串算法有KMP算法(不回溯的模式匹配)、Rabin-Karp算法(基于哈希的模式匹配)、Trie树(前缀树,用于高效地存储和检索字符串集合)和Manacher's Algorithm(用于找到给定字符串中最长的回文子串)。...
在实际应用中,这种哈希算法可以极大地提高对GB2312二级汉字的检索速度,特别是在需要频繁查询的情况下。例如,在开发中文输入法时,可以利用此算法快速地根据用户输入的拼音找到对应的汉字候选列表。 #### 六、...
6. **Trie(字典树)**:Trie是一种特殊的树形数据结构,用于高效地存储和检索字符串集合。通过将字符串的字符作为节点,可以快速进行前缀查询和插入操作。 7. **Suffix Array(后缀数组)**:后缀数组是字符串的...