// 如果数组的大小是待存储数据个数的两倍及两倍以上时,使用线性探测法。
// 线性探测法解决碰撞问题:当发生碰撞时,线性探测法检查散列表的下一个位置是否为空,如果为空,则将数据存入该位置;如果不为空,则继续检查下一个位置,直到找到一个空的位置为止。
function HashTable(){
this.table = new Array(137);
this.hashFunc = hashFunc;
this.showDistro = showDistro;
this.put = put;
this.get = get;
}
function put(data){
var pos = this.hashFunc(data);
if(this.table[pos] == null){
this.table[pos] = data;
}
else{
while(this.table[pos] != null){
++pos;
}
this.table[pos] = data;
}
}
function get(data){
var pos = -1;
pos = this.hashFunc(data);
if(pos > -1){
for(var i=pos; this.table[pos] != null; ++i){
if(this.table[pos] == data);
return this.table[pos];
}
}
return null;
}
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] != 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();
for(var i=0; i<names.length; ++i){
hTable.put(names[i]);
}
hTable.showDistro();
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();
for(var i=0; i<students.length; ++i){
hStuTable.put(students[i]);
}
hStuTable.showDistro();
11、线性探测法解决散列表碰撞问题
最新推荐文章于 2024-10-29 00:09:42 发布
