zoukankan      html  css  js  c++  java
  • 线性表 & 散列表

    线性表:

      数据排成一条线一样的机构,每个线性表上的数据最多只有前后两个方向,

      包括 数组,链表,队列,栈。

     

    非线性表 :

      数据之间并不是简单的前后关系,有二叉树、图等。

     

     

    散列表基于 数组支持按照下标访问数据的特性,是数组的一种扩展)

      通过散列函数把元素的键值 映射为 下标,然后将数据存储在数组中对应下标的位置。

      当按照键值查询元素时时,用同样的散列函数,将键值转化数组下表,从对应的数组下表的位置取数据。

    散列表源于数组,他借助散列函数对数组这种数据结构进行扩展,利用的是数组支持 按照下标

    随机访问元素的特性,散列表的两个核心问题是 散列函数设计和散列函数冲突

    散列表仅支持 添加 、查、 删 不支持修改。

    散列函数 可以定义为 hash(key),key表示元素的键值,hash(key)的值表示经过散列函数计算得到散列值。

     

    解决散列冲突的方法

    1 开放寻址法

    如果出现了散列冲突(就是经过计算完放入的table 有值的情况)就从这个table 往后 找到空位置,插入。

    探测新的位置的方法有 线性探测二次探测双重探测

    线性探测:存储位置被占用,从当前位置向后查找,有空位置就插入。

       缺点 :如果数据越来越多,耗费的时间就越来越多

    二次探测:探测的步长变成了原来的"二次方"

    双重探测:用一组散列函数,如果第一个散列函数计算的位置被占了,就用第二个散列函数计算。

    2 链表法

    散列表中,每个桶或槽 会对应一条链条,所有散列值相同的 元素 我们都放到相同槽位对应的链表中

    插入的时候只需要通过计算散列函数计算出对应的散列槽位,将其插入到对应链表中即可。

    当查找、删除一个元素时,同样通过散列函数计算出对应的槽,然后遍历链表查找或者删除。

  • 相关阅读:
    how to pass a Javabean to server In Model2 architecture.
    What is the Web Appliation Archive, abbreviation is "WAR"
    Understaning Javascript OO
    Genetic Fraud
    poj 3211 Washing Clothes
    poj 2385 Apple Catching
    Magic Star
    关于memset的用法几点
    c++ 函数
    zoj 2972 Hurdles of 110m
  • 原文地址:https://www.cnblogs.com/wy919/p/13049120.html
Copyright © 2011-2022 走看看