书名:数据结构与算法图解
作者:[美]杰伊.温格罗 (Jay Wengrow)
出版社:人民邮电出版社
出版时间:2019-04-01
ISBN: 9787115509000
知识点:
- 散列表,仅用O(1)就能找出数据,线性查找要O(n),有序数组二分查找要O(logn)
- 散列表,也称散列、映射、散列映射、字典、关联数组
- 字符串转换为数字串的过程就是散列,用于对照的密码就是散列函数,比如:A=1,B=2,C=3...那么CAB就会转换成312.
- 处理冲突:散列值相同情况,分离链接(构造数组与子数组,每个数组包含散列值相同的键值对,子数组中包含一个键值对中的键和值两个元素)
- 找到平衡:散列表效率取决于数据量、可用内存、散列函数,既要避免冲突又要节约空间
- 负载因子:黄金法则即每增加7个元素,增加10个格子,理想的负载因子是0.7(7/10)
- 用散列表查数据是否存在重复数据,数组与散列表的JavaScript描述如代码1和2
- 用散列表统计选票及其优化如代码3
代码1
function hasDuplicateValue(array) {
for (var i = 0; i < array.length; i++) {
for (var j = 0; j < array.length; j++) {
if (i !== j && array[i] === array[j]) {
return true;
}
}
}
return false;
}
代码2
function hasDuplicateValue(array) {
var existingValues = {};
for (var i = 0; i < array.length; i++) {
if (existingValues[array[i]] === undefined) {
existingValues[array[i]] = 1;
} else {
return true;
}
}
return false;
}
代码3
var votes = [];
function addVote(candidate) {
votes.push(candidate); // 生成一个很长的列表
}
function countVotes(votes) {
var tally = {};
for (var i = 0; i < votes.length; i++) { // 循环N次
if (tally[votes[i]]) {
tally[votes[i]]++;
} else {
tally[votes[i]] = 1;
}
}
return tally;
}
// 以上是用数组统计选票,以下是用散列表统计选票
var votes = {};
function addVote(candidate) {
if (votes[candidate]) {
votes[candidate]++; // 直接将选票和被选举人映射
} else {
votes[candidate] = 1;
}
}
function countVotes() {
return votes;
}