您的位置:首页 > 理论基础 > 数据结构算法

9、开链法解决散列表碰撞问题

2017-01-04 21:52 232 查看
// 散列法(Hashing)或哈希法是一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。
// 散列函数先计算字符串中各字符的ASCII码值,求和时每次要乘以一个质数后得到一个散列值,作为散列数组的索引。

// 如果数组的大小是待存储数据个数的1.5倍,则使用开链法。
// 开链法解决碰撞问题:在创建散列数组时,通过调用一个函数创建一个新的空数组,然后将该数组赋给散列数组的每一个元素,这样即使两个键散列后的值相同,依然被保存在同样的位置,只不过它们在第二个数组中的位置不一样,这样就解决了碰撞问题。

function HashTable(){
this.table = new Array(137);
this.hashFunc = hashFunc;
this.showDistro = showDistro;
this.buildChains = buildChains;
this.put = put;
this.get = get;
}

function put(data){
var pos = this.hashFunc(data);
var index = 0;
if(this.table[pos][index] == null){
this.table[pos][index] = data;
}
else{
while(this.table[pos][index] != null){
++index;
}
this.table[pos][index] = data;
}
}

function get(data){
var index = 0;
var pos = this.hashFunc(data);
if(this.table[pos][index] == data){
return this.table[pos][index];
}
else{
while(this.table[pos][index] != data){
index += 1;
}
return this.table[pos][index];
}
return null;
}

function buildChains(){
for(var i=0; i<this.table.length; ++i){
this.table[i] = new Array();
}
}

function hashFunc(data){
const H = 31;
var total = 0;
for(var i=0; i<data.length; ++i){
total += H * total +  data.charCodeAt(i);
}
total = total % this.table.length;
if(total < 0){
total += this.table.length - 1;
}

return parseInt(total);
}

function showDistro(){
log("索引值" + ":" + "对应的元素值");
for(var i=0; i<this.table.length; ++i){
if(this.table[i][0] != null){
log(i + ": " + this.table[i]);
}
}
}

// 生成指定范围的随机数
function getRandomInt(min, max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}

// 生成随机ID+分数组成的字符串作为数组的元素
function getStuData(arr){
for(var i=0; i<arr.length; ++i){
var num = "";
for(var j=1; j<=idLen; ++j){
num += Math.floor(Math.random() * 10);
}

num += getRandomInt(50, 100);
arr[i] = num;
}
}

var log = console.log;

log("---------- 散列化字符串 ----------");
var names = ["散列", "David", "Jennifer", "Donnie", "Raymond", "Cynthia", "Mike", "Clayton", "Danny", "Jonathan"];

log("待散列的字符串: ");
var str = "";
for(var i=0; i<names.length; ++i){
str += names[i] + " ";
}
log(str);
log("");

log("散列化后的字符串: ");
var hTable = new HashTable();
hTable.buildChains();
for(var i=0; i<names.length; ++i){
hTable.put(names[i]);
}
hTable.showDistro();
log("");

log("---------- 散列化整型键 ----------");
var numStrdents = 9;	//学生人数
var idLen = 9;			//ID长度
var students = new Array(numStrdents);
getStuData(students);

log("待散列的整型: ");
log("ID" + "---" + "分数");
for(var i=0; i<students.length; ++i){
log(students[i].substring(0, idLen) + " " + students[i].substring(idLen));
}
log("");

log("散列化后的整型: ");
var hStuTable = new HashTable();
hStuTable.buildChains();
for(var i=0; i<students.length; ++i){
hStuTable.put(students[i]);
}
hStuTable.showDistro();




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 hashtable