散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key 对应一个存储位置f (key)。查找时,根据这个确定的对应关系找到给定值key 的映射f (key) ,若查找集合中存在这个记录,则必定在f (key) 的位置上。这里我们把这种对应关系f 称为散列函数, 又称为哈希(Hash) 函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。 那么关键字对应的记录存储位置我们称为散列地址。
如果没有哈希冲突,散列表是一种非常高效的查找数据结构,其时间复杂度为O(1)。
hash表类似于数组,不同于数组,数组的下标只能是数,hash表可以是任何东西,更像是python中的字典,但hash表是拥有o(1)时间复杂度查找算法的存储结构。java中,我们使用hash表来存储的话。要考虑到hash的顺序问题,这就是问什么会有hashmap和linkedhashmap的原因了。
对于这道题,我们的思路就是循环一遍字符数组(这里的o(n)时间复杂度是无法避免的),把所有的字符存储到key的位置,value的位置用于计数。如果key重复(这种比对操作要控制在o(1),就只能使用hash),则value的值增加。最后,只需要循环一遍,输出第一个value=1的key就可以了。
import java.util.LinkedHashMap;
public class hashTable {
publicstatic void main(String args[]){
Stringstr="abaccdeff";
LinkedHashMap<Character,Integer>hm=new LinkedHashMap<Character,Integer>();
char[]array=str.toCharArray();
for(inti=0;i<array.length;i++){
if(hm.containsKey(array[i])){//正是这里的比对是o(1),才能使总时间复杂度控制在线性复杂度
hm.put(array[i],hm.get(array[i])+1);
}else{
hm.put(array[i], 1);
}
}
for(chark:hm.keySet()){
if(hm.get(k)==1){
System.out.println(k);
break;
}
}
}
}