数据结构:hash桶结构

#include <iostream>
#include <stdlib.h>
#define _SIZE_ 7
using namespace std;

template<typename Type>
struct Node
{
    Type data;
    Node *next;
    Node(Type d = Type()) :data(d), next(NULL){}
};

template<typename Type>
struct myNode
{
    Node<Type> node[3];
    int count;
    myNode<Type> *mynext;
    myNode() :mynext(NULL)
    {
        count = 0;
    }
};

template<typename Type>
struct HashNode
{
    myNode<Type> *adj;
    Type flags;
    HashNode(Type d = Type()) :flags(d), adj(NULL){}
};

template<typename Type>
class Hash
{
public:
    Hash()
    {
        int i = 0;
        for (; i < _SIZE_; i++)
        {
            hashNode[i].flags = i;
        }
    }
    int hash(Type val)
    {
        return val%_SIZE_;
    }
    void Insert(int a[], int n)
    {
        int i = 0;
        for (; i < n; i++)
        {
            int index = hash(a[i]);
            myNode<Type> *p = hashNode[index].adj;
            myNode<Type> *s = NULL;
            if (p == NULL)
            {
                s = new myNode<Type>();
                s->node[s->count].data = a[i];
                s->count++;
                p = s;
                hashNode[index].adj = s;
            }
            else
            {
                while (p->mynext != NULL )
                {
                    p = p->mynext;
                }
                if (p->count == 3)
                {
                    s = new myNode<Type>();
                    s->node[s->count++].data = a[i];
                    p->mynext = s;
                    p = s;
                }
                else
                {
                    p->node[p->count++].data = a[i];
                }
            }
        }
    }
    void Printf()
    {
        int i = 0;
        for (; i < _SIZE_; i++)
        {
            cout <<"val="<<  i << ":";
            myNode<Type> *p = hashNode[i].adj;
            while (p != NULL)
            {
                int j = 0;
                for (; j < p->count; j++)
                {
                    cout << p->node[j].data << "   ";
                }
                p = p->mynext;
            }
            cout << endl;
        }
    }
private:
    HashNode<Type> hashNode[_SIZE_];
};

int main()
{
    int n = 40;
    int *a = new int[n];
    for (int i = 0; i < 40; i++)
    {
        a[i] = rand() % 40;
    }
    Hash<int> sh;
    sh.Insert(a, 40);
    sh.Printf();
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-27 15:37:23

数据结构:hash桶结构的相关文章

MySQL源码 数据结构hash

MySQL源码自定义了hash表,因为hash表具有O(1)的查询效率,所以,源码中大量使用了hash结构.下面就来看下hash表的定义: [源代码文件include/hash.h mysys/hash.c] typedef uint my_hash_value_type; typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool); typedef void (*my_hash_free_key)(void *); type

hash桶

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "chain.c" //include the chain.c to create chain and list 4 #define NUMBER_SCOPE 69000 5 #define ARRAY_SIZE 100000000 6 #define PLUS_RESULT 5 7 8 int *createArray(long length){ 9 i

openVswitch(OVS)源码分析之工作流程(哈希桶结构体的解释)

这篇blog是专门解决前篇openVswitch(OVS)源码分析之工作流程(哈希桶结构体的疑惑)中提到的哈希桶结构flex_array结构体成员变量含义的问题. 引用下前篇blog中分析讨论得到的flex_array结构体成员变量的含义结论: struct { int element_size; // 这是flex_array_part结构体存放的哈希头指针的大小 int total_nr_elements; // 这是全部flex_array_part结构体中的哈希头指针的总个数 int e

数据结构 : Hash Table

http://www.cnblogs.com/lucifer1982/archive/2008/06/18/1224319.html 作者:Angel Lucifer 引子 这篇仍然不讲并行/并发. Hash table,国内相当一部分书籍将其直译为哈希表,但博主本人喜欢称其为散列表. 散列表支持任何基于 Key-Value 对的插入,检索,删除操作. 比如在 .NET 1.x 版本下,我们可以这样使用: 10 namespace Lucifer.CSharp.Sample 11 { 12   

[数据结构] Hash表、Hash函数及冲突解决

1.Hash表 哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构.也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间的的单元地址,将该元素存储到函数值对应的单元中. 哈希表存储的是键值对,其查找的时间复杂度与元素数量多少无关,哈希表在查找元素时是通过计算哈希码值来定位元素的位置从而直接访问元

I学霸官方免费教程三十六:Java数据结构之双向链表结构

数据结构之双向链表 例如:现有双向链表TwoWayLinked中存储着1,2,3,4四个元素,那么集合对象中会有4个节点A.B.C.D,由上述结构可以知道,节点A中存储着元素1和节点B:节点B中存储着元素2和节点A和节点C,节点C中存储着元素3和节点B和节点D,节点D中存储着元素4和节点C.如果现在要在元素2和3中间插入一个元素5: 过程如下: 1.创建节点E,E中存储元素5 2.将E中的上一个节点赋值为节点B 3.将B中的下一个节点修改为节点E 4.将E中的下一个节点赋值为节点C 5.将C中的

SQL Server 索引(一)数据结构和存储结构

本文关注以下方面(本文所有的讨论基于SQL Server数据库): 索引的分类: 索引的结构: 索引的存储 一.索引定义分类 让我们先来回答几个问题: 什么是索引? 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 举个例子,索引就像我们查字典时用的按拼音或笔画或偏旁部首 有哪些索引? 从物理结构上可分为两种:聚集索引和非聚集索引 (此外还有空间索引.筛选索引.XML索引) 索引说明 (http://msdn.microsoft.com/zh-cn/l

数据结构1 线性结构

数据结构是指数据元素的结合及元素间的相互关系和构造方法.元素之间的相互关系是数据的逻辑结构,元素关系的存储形式成为存储结构.数据结构按照逻辑关系的不同分为线性结构和非线性结构两大类.其中线性结构是最基本的结构,元素顺序排列,常见的有线性表.栈.队列.数组.串. 一.线性表 1.线性表是最简单也是最常用的一种线性结构.一个线性表示n(n>=0)个元素的有限序列,非空线性表的特点为: 存在唯一的一个"第一个"元素: 存在唯一的一个"最后一个"元素: 除第一个元素外

大话数据结构——队列顺序存储结构

#include<iostream> using namespace std; #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0 #define MAXSIZE 10 typedef int status;//返回的状态值 typedef int elemtype;//数据的类型 //数据结构 typedef struct queue_list { elemtype data[MAXSIZE];//队列里的元素 int re