算法导论11.4开放寻址法(除法哈希函数开放寻址处理冲突)

/*
 * IA_11.4OpenAddressing.cpp
 *
 *  Created on: Feb 12, 2015
 *      Author: sunyj
 */
#include <stdint.h>
#include <string.h>
#include <iostream>
class Node {
public:
    Node() { }
    Node(int64_t const k, int64_t const d) : key(k), data(d) { }
    int64_t key;
    int64_t data;
};

class OpenAddressingLinerProb {

public:
    OpenAddressingLinerProb(int64_t const n) : length(n)
    {
        data = new Node[n]();
        memset(data, -1, n * sizeof(Node));
    }
    int64_t HashFunc(int64_t const key)
    {
        return key % length;
    }
    Node HashFuncLinerProbSearch(int64_t const key)
    {
        for (int64_t i = 0; i < length; i++)
        {
            if (data[HashFunc(key) + i].key == key)
            {
                return data[HashFunc(key) + i];
            }
        }
        return Node();
    }
    void HashFuncLinerProbInsert(Node const x)
    {
        for (int64_t i = 0; i < length; i++)
        {
            if (data[HashFunc(x.key) + i].key == -1)
            {
                data[HashFunc(x.key) + i] = x;
                return ;
            }
        }
    }
private:
    Node*   data;
    int64_t length;
};

int main()
{
    OpenAddressingLinerProb linertable(7);
    Node node2(2, 200);
    Node node3(5, 300);
    Node node9(9, 900);
    Node node4(4, 400);

    linertable.HashFuncLinerProbInsert(node2);
    linertable.HashFuncLinerProbInsert(node3);
    linertable.HashFuncLinerProbInsert(node9);
    linertable.HashFuncLinerProbInsert(node4);

    Node tmp = linertable.HashFuncLinerProbSearch(4);
    std::cout << tmp.data << std::endl;
    tmp = linertable.HashFuncLinerProbSearch(2);
    std::cout << tmp.data << std::endl;
    tmp = linertable.HashFuncLinerProbSearch(9);
    std::cout << tmp.data << std::endl;
    return 0;
}

// Linear probing

时间: 2024-10-29 19:08:27

算法导论11.4开放寻址法(除法哈希函数开放寻址处理冲突)的相关文章

算法学习 - HashTable开放地址法解决哈希冲突

开放地址法解决哈希冲突 线性开放地址法 线性开放地址法就是在hash之后,当发现在位置上已经存在了一个变量之后,放到它下一个位置,假如下一个位置也冲突,则继续向下,依次类推,直到找到没有变量的位置,放进去. 平方开放地址法 平方地址法就是在hash之后,当正确位置上存在冲突,不放到挨着的下一个位置,而是放到第2^0位置,假如继续冲突放到2^1的位置,依次2^3... 直到遇到不冲突的位置放进去. 双散列开放地址法 双散列同上,不过不是放到2^的位置,而是放到key - hash(key, tab

算法导论11.2散列表Hash tables链式法解决碰撞

/* * IA_11.2ChainedHash.cpp * * Created on: Feb 12, 2015 * Author: sunyj */ #include <stdint.h> #include <iostream> #include <string.h> // CHAINED-HASH-INSERT(T, x) // insert x at the head of list T[h(x.key)] // CHAINED-HASH-SEARCH(T, k)

基本数据结构(1)&mdash;&mdash;算法导论(11)

1. 引言     从这篇博客开始,来介绍一些基本的数据结构知识.本篇及下一篇会介绍几种基本的数据结构:栈.队列.链表和有根树.此外还会介绍由数组构造对象和指针的方法.     这一篇主要介绍栈和队列,它们都是动态集合.     从数据的逻辑结构上讲,在它们上进行delete操作所移除的元素是固定的:在栈(stack)中,被删除的是最近插入的元素(后进先出,LIFO,last-in,first-out):而在队列(queue)中,被删除的元素是最先插入的元素(先进先出,FIFO,first-in

算法导论11:优化后的数组实现的队列 2016.1.11

本来想假期再继续,结果发现写博客已经成了总结自己的一种习惯,所以还是继续写吧. 其实有一部分原因是今天英语考砸了..哈哈,不管那些了,看来以后学习方式得改变一下,不能太功利,从简单开始,一点一点做好. 今天是队列的数组优化.昨天的队列有一个致命弱点,就是能盛放的数据数量越来越少,至于原因可以自己思考也可以上网搜索.如果是链表实现的话因为是动态分配空间,就完全不会有这个问题. 优化就是用了取模运算,实现数组空间的循环运用. 下面是代码: #include<stdio.h> #define MAX

【原创】算法导论11章带星第4题试解

题目: 我们希望在一个[非常大]的数组上,通过利用直接寻址的方式来实现一个字典.开始时,该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大.请给出在大数组上实现直接寻址字典的方案.每个存储对象占用O(1)空间:SEARCH.INSERT和DELETE操作的时间均为O(1):并且对数据结构初始化的时间为O(1). (提示:可以利用一个附加数组,处理方式类似于栈,其大小等于实际存储在字典中的关键字数目,以帮助确定大数组中某个给定的项是否有效) 解答: 这个提示非

开放定址法构造哈希表

#define NULLKEY -1 #define DELKEY -2 typedef int KeyType; typedef struct { KeyType key; int count;//探测次数域 }HashTable; void InsertHT(HashTable HT[], KeyType k, int& n, int m, int p) { //n哈希表中总元素的个数,m表长 int i, adr; adr = k % p; if (HT[adr].key == NULLK

算法导论 第十章 基本数据类型 &amp; 第十一章 散列表(python)

更多的理论细节可以用<数据结构>严蔚敏 看几遍,数据结构很重要是实现算法的很大一部分 下面主要谈谈python什么实现 10.1 栈和队列 栈:后进先出LIFO 队列:先进先出FIFO python 中使用list实现在这些功能 栈:压栈 append() 退栈   pop() 队列:   入队 append() 出队 pop(0) 栈: >>> stack = list() >>> stack.append(3) >>> stack.ap

《算法导论》— Chapter 11 散列表

1 序 在很多应用中,都要用到一种动态集合结构,它仅支持INSERT.SEARCH以及DELETE三种字典操作.例如计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键字为任意字符串,与语言中的标识符相对应.实现字典的一种有效数据结构为散列表. 散列表是普通数组的推广,因为可以对数组进行直接寻址,故可以在O(1)的时间内访问数组的任意元素.对于散列表,最坏情况下查找一个元素的时间与在链表中查找的时间相同,为O(n),但是在实践中,散列表的效率通常是很高的,在一些合理的假设下,散列表中查

散列表的开放寻址法

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