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

    线性表:

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

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

     

    非线性表 :

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

     

     

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

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

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

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

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

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

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

     

    解决散列冲突的方法

    1 开放寻址法

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

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

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

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

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

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

    2 链表法

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

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

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

  • 相关阅读:
    转:request.getSession(true)和request.getSession(false)的区别
    转:Linux中文显示乱码?如何设置centos显示中文
    Linux Centos 6.5_x86安装Nginx
    Java反射详解
    Java泛型
    泛型的通配符扩展
    文本分类:survey
    CRF++官方文档
    Paper: Bidirectional LSTM-CRF Models for Sequence Tagging
    PCA数学推导及原理(转)
  • 原文地址:https://www.cnblogs.com/wy919/p/13049120.html
Copyright © 2011-2022 走看看