zoukankan      html  css  js  c++  java
  • 数据结构-哈希

    首先讲讲什么是直接寻址

    直接寻址表的定义
    假设有一个数据集合U={d1,d2,d3,...,dn}U={d1,d2,d3,...,dn},该数据集合里面的每一个元素didi都有一个对应的键值keyikeyi和数据dataidatai。集合中的任意一个keyikeyi都是在[0,m][0,m]之间的整数。新建一个数组A[0..m]A[0..m],遍历一遍集合UU,将其中的数据didi放到A[keyi]A[keyi]中。

    如果存的是两个树1和10000 那么就要开辟一段内存从1到10000,这样对空间是很大浪费,所以就有来哈希表

    哈希表:

    .哈希表(Hash Table ,  又称散列表 )是线性表对存储结构,由直接寻址表和一个哈希函数组成,哈希函数h(k)将元素k作为自变量

    返回元素存储下标

    举个栗子:


    class HashTable:
    def __init__(self,size=101):
    self.size = size
    self.T = [LinkList() for i in range(self.size)]

    def h(self,k):
    return k % self.size

    def insert(self,k):
    i = self.h(k)
    if self.find(k):
    print('duplicated insert')
    else:
    self.T[i].append(k)


    def find(self,k):
    i = self.h(k)
    return self.T[i].find(k)

    就以上栗子,哈希函数h(k)取余 会有问题,会有重复,那么这就是哈希冲突

    处理冲突的方法

    (1)开放定址法(2)拉链法 (3)建立公共溢出区法
    拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组t[0..m-1]。凡是散列地址为i的结点,均插入到以t为头指针的单链表中。t中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。

     

    处理哈希冲突对方法还有很多种,这里不一一说明

  • 相关阅读:
    微服务技术选型
    分布式事务
    微服务架构下的身份认证
    java core
    java web基础知识
    java基础知识学习 内存相关
    java基础知识学习 java异常
    java 基础知识学习 JVM虚拟机参数配置
    java 基础知识学习 内存泄露(memory leak) VS 内存溢出(out of memory)以及内存管理
    【F12】chrome浏览器中 F12 功能的简单介绍
  • 原文地址:https://www.cnblogs.com/sunny666/p/10744520.html
Copyright © 2011-2022 走看看