散列碰撞的解决方法——线性探测法(开放寻址法的一种)

    function HashTable() {
        this.table = new Array(137);//137——官方比较好的设置数组大小的值
        this.betterHash = betterHash;
        this.showDistro = showDistro;
        this.put = put;
        //this.get=get;
    }
    function betterHash(data) {
        var cons = 31;//此参数的设置是为了避免碰撞
        var total = 0;
        for ( var i = 0; i < data.length; ++i) {
            total += cons * total + data.charCodeAt(i);
        }
        total = total % this.table.length;
        document.write("Hash value: " + data + " -> " + total + "<br />");//测试是否有相同的散列值
        if (total < 0) {
            total += this.table.length - 1;
        }
        return parseInt(total);
    }
    function put(data) {
        var pos = this.betterHash(data);
        if (this.table[pos] == undefined) {
            this.table[pos] = data;
        } else {
            while (this.table[pos] != undefined) {
                pos++;
            }
            this.table[pos] = data;
        }
    }
    function showDistro() {
        for ( var i = 0; i < this.table.length; ++i) {
            if (this.table[i] != undefined) {
                document.write(i + ": " + this.table[i]);
                document.write("<br />");
            }
        }
    }
    var hTable = new HashTable();
    var someNames = [ "David", "Jennifer", "Donnie", "Raymond", "Cynthia",
            "Mike", "Clayton", "Danny", "Jonathan" ];
    for ( var i = 0; i < someNames.length; ++i) {
        hTable.put(someNames[i]);
    }
    hTable.showDistro();
时间: 2024-10-25 17:29:52

散列碰撞的解决方法——线性探测法(开放寻址法的一种)的相关文章

C# Dictionary源码剖析---哈希处理冲突的方法有:开放定址法、再哈希法、链地址法、建立一个公共溢出区等

参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/wangjun1234/p/3719635.html 源代码版本为 .NET Framework 4.6.1 Dictionary是Hashtable的一种泛型实现(也是一种哈希表)实现了IDictionary泛型接口和非泛型接口等,将键映射到相应的值.任何非 null 对象都可以用作键.使用与Hashtable不同的冲突解决方法,D

散列表的开放寻址法

开放寻址法(open addressing)中,所有元素都存放在槽中,在链表法散列表中,每个槽中保存的是相应链表的指针,为了维护一个链表,链表的每个结点必须有一个额外的域来保存它的前戏和后继结点.开放寻址法不在槽外保存元素,不使用指针,也不必须为了维护一个数据结构使用额外的域,所有可以不用存储指针而节省的空间,使得可以用同样的空间来提供更多的槽,也潜在地减少了冲突,提高了检索速度. 为了使用开放寻址法插入一个元素,需要连续地检查散列表,或称为探查(probe),直到找到一个空槽来放置待插入的关键

转载:散列冲突的解决策略

冲突解决的策略 尽管散列函数的目标是使得冲突最少,但实际上冲突是无法避免的.因此,我们必须研究冲突解决策略.冲突解决技术可以分为两类:开散列方法( open hashing,也称为拉链法,separate chaining )和闭散列方法( closed hashing,也称为开地址方法,open addressing ).这两种方法的不同之处在于:开散列法把发生冲突的关键码存储在散列表主表之外,而闭散列法把发生冲突的关键码存储在表中另一个槽内. 开散列方法: 1.拉链法 开散列方法的一种简单形

哈希表冲突的两个解决方法线性探测和分离链接法

1.线性探测法 就是当要插入的行号发生冲突时,往下一个行号存放哈希值,直到没有冲突. 2.分离链接法 就是将一个行号做成链表的形式,如果有这个行号的冲突便新建一个节点将其插入这个行号的链表中. 在Mahout中,FastByIDMap是基于散列的,但它在处理散列冲突时使用的是线性探测,而非分离链接.因为线性探测不必为每个条目新增加一个额外的Map.Entry对象,节省了内存开销:在数据规模很庞大的时候,这种优势更加体现得出来.

散列碰撞问题的解决——开链法(拉链法)

function HashTable() { this.table = new Array(137);//137——官方比较好的设置数组大小的值 this.buildChains = buildChains; this.simpleHash = simpleHash; this.showDistro = showDistro; this.put = put; //this.get=get; } function buildChains() {//核心方法 for ( var i = 0; i <

ftp列表错误,flashfxp列表错误,ftp无法列目录的解决方法

可能很多老站长,在使用FTP的时候,经常发现FTP无法连接,显示列表错误,无法列目录等,通过N种办法就是无法解决,下面动天数据来帮助大家解决把. 实际上这种问题,在长宽带宽,铁通宽带,移动宽带偶尔发生,其他电信和联通几乎没出现,当然也不限服务器出现,我们帮客户代购万网的国内空间也发生这种情况,可见这种情况是任何服务器都出现的,怀疑问题可能性就是移动宽带的端口暂时屏蔽了该IP的被动链接端口导致. 搜索:列表错误,我们发现这种问题都是通过修改FTP的参数,修改被动为主动模式,但是无法解决此问题,所以

数据结构--开放定址法解决散列冲突时几种探测法的比较

开放定址法解决散列冲突时主要有线性探测法,平方探测法和双散列法,以下代码通过插入大量随机数,来统计几种探测法产生冲突的次数. #include<iostream> using namespace std; #define MinTablesize 10 #define Num 3000 typedef unsigned int Index; typedef Index Position; struct Hashtal; typedef struct Hashtal *Hashtable; in

学习笔记:散列

一.简述 散列是一种数据访问技术,所有的数据项均有散列码与之关联. 散列码可在任何时候通过散列函数计算得到,通常为数据索引. 二.散列构造 ①直接定址法:取关键字本身或其线性函数计算结果作为散列码. ②数字分析法:取关键字中分布较均匀的若干位作为散列码. ③折叠法:根据表长取关键字拆分为若干等长部分后叠加求和并去掉进位的结果作为散列码.(可存在一个不等长部分) ④平方取中法:根据表长取关键字平方数值中间的若干位作为散列码. ⑤除留余数法:根据表长取关键字模运算结果作为散列码. 三.冲突处理 ①开

线性探测再散列 建立HASH表

根据数据元素的关键字和哈希函数建立哈希表并初始化哈希表,用开放定址法处理冲突,按屏幕输出的功能表选择所需的功能实现用哈希表对数据元素的插入,显示,查找,删除. 初始化哈希表时把elem[MAXSIZE].elemflag[MAXSIZE]和count分别置0.创建哈希表时按哈希函数创建哈希表,输入数据元素的关键字时,以“0”结束输入且要求关键字为正整数,数据元素个数不允许超过表长MAXSIZE. 输出的形式:根据所选择的哈希表的功能输出相应提示语句和正确结果. 程序的功能:将一组个数不超过哈希表