• 常见存储、查找算法


    存储

    1. 散列存储:即哈希的存储方式。

    2. 顺序存储:数组的存储方式

    3. 链式存储:链式前向星、vector<>

    4. 压缩存储

    5. 索引存储

    查找

    常见查找算法

    顺序查找

    一个一个往下找,复杂度 (O(dfrac{n+1}{2}))

    适合顺序存储,不适合压缩存储、索引存储等。

    折半查找、二分查找

    查找次数:(a<log_2 n<b(a,b,cin mathbb{Z}))

    查找失败时,至少比较 (a) 次关键字;查找成功时,最多比较关键字次数是 (b)

    差值查找

    咕咕咕

    斐波那契查找

    咕咕咕

    二叉查找树

    二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

    1. 若任意节点的左子树不空,则左子树上所有节点的key值均小于它的根节点的值;

    2. 若任意节点的右子树不空,则右子树上所有节点的key值均大于它的根节点的值;

    3. 任意节点的左、右子树也分别为二叉查找树;

    4. 没有键值相等的节点。

    分块查找

    分块查找又称索引顺序查找,它是顺序查找的一种改进方法。

    算法的思想是将 (n) 个数据元素"按块有序"划分为 (m) 块( (mle n) )。每一块中的结点不必有序,但块与块之间必须"按块有序",每个块内的的最大元素小于下一块所有元素的任意一个值。

    在块与块之间进行二分操作。

    时间复杂度:(O(log m + dfrac{n}{m}))

    哈希查找

    哈希通过散列表来实现存储与查找。

    其中散列函数只要有一下几类:

    1. 直接定址法:取关键字或关键字的某个线性函数值为散列地址。即 ( ext{Hash}(k) = k)( ext{Hash}(k) = a imes k + b) ,其中 (a,b) 为常数(这种散列函数叫做自身函数)

    2. 数字分析法:假设关键字是以 (r) 为基的数,并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。

    3. 平方取中法:取关键字平方后的中间几位为哈希地址。通常在选定哈希函数时不一定能知道关键字的全部情况,取其中的哪几位也不一定合适,而一个数平方后的中间几位数和数的每一位都相关,由此使随机分布的关键字得到的哈希地址也是随机的。取的位数由表长决定。

    4. 折叠法:将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。

    5. 随机数法

    6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 ( ext{Hash}(k) = k pmod{p})(ple m) 。不仅可以对关键字直接取模,也可在折叠法、平方取中法等运算之后取模。对 (p) 的选择很重要,一般取素数或 (m) ,若 (p) 选择不好,容易产生冲突。

    为了避免哈希冲突,一般有一下几种方法:

    • 开放寻址法

      • 线性探测法:若发现位置已经被占用,则一个一个往后找。

      • 二次探测法:采用开放定址法处理冲突中的二次探测再散列(也即是题目中的二元探测法),则哈希函数变为 ( ext{Hash}(k)=( ext{Hash}(k)+d) pmod{mod}),其中 (d=1^2,-1^2,2^2,-2^2,3^2,dots)

      • 双重散列

    • 链地址法:把数值加入哈希的链表中。

    (复赛中)也可以使用线性探测法解决哈希冲突问题

  • 相关阅读:
    www.verycd.com
    HDU-5281
    HDU-5280
    UVALive 6426
    hihocoder 1178 : 计数
    hihocoder 1177 : 顺子
    HDU-5272
    Tomcat 部署项目的三种方法
    Oracle数据库PLSQL的中文乱码显示全是问号
    ORACLE的sign函数和DECODE函数
  • 原文地址:https://www.cnblogs.com/EricQian/p/15080265.html
Copyright © 2020-2023  润新知