我们前面提到过, 容量最好是质数.
虽然在链地址法中将容量设置为质数, 没有在开放地址法中重要, 但是其实链地址法中质数作为容量也更利于数据的均匀分布. 所以, 我们还是完成一下这个步骤.
判断质数
-
我们这里先讨论一个常见的面试题, 判断一个数是质数.
-
质数的特点:
- 质数也称为素数.
- 质数表示大于1的自然数中, 只能被1和自己整除的数.
-
OK, 了解了这个特点, 应该不难写出它的算法:
function isPrime(num) { for (var i = 2; i < num; i++) { if (num % i == 0) { return false } } return true } // 测试 alert(isPrime(3)) // true alert(isPrime(32)) // false alert(isPrime(37)) // true
-
但是, 这种做法的效率并不高. 为什么呢?
- 对于每个数n,其实并不需要从2判断到n-1
- 一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n).
- 比如16可以被分别. 那么是2*8, 2小于sqrt(16), 也就是4, 8大于4. 而4*4都是等于sqrt(n)
- 所以其实我们遍历到等于sqrt(n)即可
function isPrime(num) { // 1.获取平方根 var temp = parseInt(Math.sqrt(num)) // 2.循环判断 fo