zoukankan      html  css  js  c++  java
  • 哈希表

    哈希表(好不容易搞懂了)

    知识讲解

        如果存储和使用线性表(1,75,324,43,1353,90,46),那么,只要定义一个一维数组和a[7],将表中元素按先后顺序存储在a[i]中即可。但是,这样的存储结构会给“查找算法”带来O(n)的时间开销,尤其是n很大时,效率比较差。当然,也可以采用“二分查找”提高效率。反之,为了用O(1)的时间实现查找,可以分析这个线性表的元素类型和范围,定义一个一维数组a[1353],使得a[key]=key,即线性表的key这个元素存储在a[key]中。这样一来,查找的时间效率高了,空间上的开销却大了,尤其是数据范围分布很广时。为了使空间开销减小,可以对这种方法进行优化,设计一个函数h(key)=key mod 13,然后把key存储在a[h(hey)]中。这样一来,只要定义一个一维数组a[12]就足够了。这种线性表的这种结构称之为哈希表(Hash Table)

        哈希表,又称散列表。是利用关键字与地址的直接映射关系产生的列表。他的最大优势在于,一个关键字对应一个存储位置(理想情况下),而我们直接就可以由key值找到其在散列表中的位置,大大缩减了我们查找的时间。

    哈希表的构造方法

    哈希表构造原则:1.计算简单,复杂算法将会影响查找上的优势 2.散列地址分布均匀,这样我们不需要过多的解决散列表冲突问题,提高效率。

    构造具体方法

    • 由于是比较简单的哈希表,因此哈希函数我选择了简单的除留余数法f(key)=key mod p(p<=m)。
    • 处理冲突的时候,我采用了开放定址法f(key) = (f(key)+di) mod m(di=1,2,3,4...m-1)

     例题

    题目描述

    好吧,题目是这样的:给出一串数以及一个数字 C,要求计算出所有 A-B=C 的数对的个数。(不同位置的数字一样的数对算不同的数对)

    输入输出格式

    输入格式:

    第一行包括22个非负整数NN和CC,中间用空格隔开。

    第二行有NN个整数,中间用空格隔开,作为要求处理的那串数。

    输出格式:

     输出一行,表示该串数中包含的所有满足A-B=CAB=C的数对的个数。

    输入输出样例

    输入样例#1:
    4 1
    1 1 2 3
    
    输出样例#1:
    3


    例题代码
     1 #include <iostream>
     2     #include <map>
     3     using namespace std;
     4     typedef long long LL;
     5     LL a[200001];
     6     map<LL,LL> m;
     7     int main() {
     8         int n;
     9         LL c;
    10         LL ans=0;
    11         cin >> n >> c;
    12         for(int i=1;i<=n;i++) {
    13             cin >> a[i];
    14             m[a[i]]++;
    15             a[i]-=c;    
    16         } 
    17         for(int i=1;i<=n;i++) ans+=m[a[i]];
    18         cout << ans << endl;
    19         return 0;
    20 }


  • 相关阅读:
    安装Visual_Studio的艰辛历程
    桶排序和直接排序的算法和数据结构
    链式队列的c++代码和原理以及编译分析
    C# 利用xmlhttp根据网址调用接口获取数据
    使用 LINQ To SQL 和实体框架实现灵活的数据访问
    K51的安装包和ET199的开发包和示例
    The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[BMS.DataAccess.Models.ServiceTyp
    VS2008中文版中安装 silverlight 3 英文版
    让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求(转)
    在windows2003+IIS6部署dot net的MVC项目
  • 原文地址:https://www.cnblogs.com/weilinxiao/p/11069218.html
Copyright © 2011-2022 走看看