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

10、开链法解决散列表保存字典的碰撞问题

2017-01-04 21:55 246 查看
function HashTable(){
this.table = new Array(137);
this.hashFunc = hashFunc;
this.showDistro = showDistro;
this.buildChains = buildChains;
this.put = put;
this.get = get;
}

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

function get(key){
var index = 0;
var pos = this.hashFunc(key);
if(this.table[pos][index] == key){
return this.table[pos][index + 1];
}
else{
while(this.table[pos][index + 2] != key){
index += 2;
}
return this.table[pos][index + 3];
}
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("索引值" + ":" + "ID - 分数");
for(var i=0; i<this.table.length; ++i){
if(this.table[i][0] != null){
var str = i + ": ";
for(var j=0; j<this.table[i].length; j+=2){
str += this.table[i][j] + "-" + this.table[i][j + 1] + " ";
}
log(str);
}
}
}

// 生成指定范围的随机数
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": "123"}, {"Jennifer": "456"}, {"Donnie": "789"}, {"Raymond": "111"}, {"Cynthia": "222"}, {"Mike": "333"}, {"Clayton": "345"}, {"Danny": "268"}, {"Jonathan": "999"}];

log("待散列的字符串字典: ");
var str = "", i = 0;
str += "David: " + names[i++].David + "  ";
str += "Jennifer: " + names[i++].Jennifer + "  ";
str += "Donnie: " + names[i++].Donnie + "  ";
str += "Raymond: " + names[i++].Raymond + "  ";
str += "Cynthia: " + names[i++].Cynthia + "  ";
str += "Mike: " + names[i++].Mike + "  ";
str += "Clayton: " + names[i++].Clayton + "  ";
str += "Danny: " + names[i++].Danny + "  ";
str += "Jonathan: " + names[i++].Jonathan + "  ";
log(str);
log("");

log("散列化后的字符串字典: ");
var j = 0;
var hTable = new HashTable();
hTable.buildChains();
hTable.put("David", names[j++].David);
hTable.put("Jennifer", names[j++].Jennifer);
hTable.put("Donnie", names[j++].Donnie);
hTable.put("Raymond", names[j++].Raymond);
hTable.put("Cynthia", names[j++].Cynthia);
hTable.put("Mike", names[j++].Mike);
hTable.put("Clayton", names[j++].Clayton);
hTable.put("Danny", names[j++].Danny);
hTable.put("Jonathan", names[j++].Jonathan);
hTable.showDistro();
log("");

log("输入键,获取对应的值: ");
log("David" + ": " + hTable.get("David"));
log("Jennifer" + ": " + hTable.get("Jennifer"));
log("Donnie" + ": " + hTable.get("Donnie"));
log("Raymond" + ": " + hTable.get("Raymond"));
log("Cynthia" + ": " + hTable.get("Cynthia"));
log("Mike" + ": " + hTable.get("Mike"));
log("Clayton" + ": " + hTable.get("Clayton"));
log("Danny" + ": " + hTable.get("Danny"));
log("Jonathan" + ": " + hTable.get("Jonathan"));

log("");
log("");

log("---------- 散列化整型字典 ----------");
var numStrdents = 10;	//学生人数
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].substring(0, idLen), students[i].substring(idLen));
}
hStuTable.showDistro();
log("");

log("输入ID,获取对应的分数: ");
for(var i=0; i<students.length; ++i){
var ID = students[i].substring(0, idLen);
log(ID + ": " + hStuTable.get(ID));
}




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