哈希Hash 算法

注意


文章详解(http://blog.csdn.net/v_july_v/article/details/6256463)

哈希由来:

  1. 数组的特点是:寻址容易,插入和删除困难
  2. 链表的特点是:寻址困难,插入和删除容易

做出一种寻址容易,插入删除也容易

这里写图片描述

哈希特点:

  1. 通过散列算法,变换成固定长度的输出;
  2. 散列值的空间通常远小于输入的空间, 不同的输入可能会散列成相同的输出,
    不可能从散列值来唯一的确定输入值
  3. 一种将任意长度的消息压缩到某一固定长度的消息摘要的函数 HASH主要用于
  4. 信息安全领域中加密算法,一些不同长度的信息转化成杂乱的128位的编码,HASH值

哈希表长度该定义多大:

一般采用哈希算法的时候,哈希表的长度设为多大?有什么依据?

  1. 越长碰撞越少,但耗得资源也就多了
  2. 最大的出发点就是没有冲突
  3. 哈希就是散列,散列就是把关键字分布均匀撒到到每一个桶内,哈希表越长,散列函数越好,自然查找效率就越高.

哈希表长度定义举例说明:

比如说要处理的数据集合有100,000个,每一项的数据占用内存约为50bytes,我的哈希表的长度在多大比较合适?

  1. hash表里面存指针,表长整成数据集合的10倍,100000*4*10 也就是4MB内存
  2. 空间换时间(越长碰撞越少,内存消耗越多,查找和插入速率越接近O(1))

一万,一千万,一亿数据需要多少空间:

1万数据,1个数据1Byte
1,0000 -> 10,000 大约10KB

1千万数据,1个数据1Byte
1000,0000 -> 10,000,000 大约10M

1亿数据,1个数据1Byte
10000,0000 -> 100,000,000 大约100M

10亿数据,1个数据1Byte
10,0000,0000 -> 1,000,000,000 大约1G

1Byte = 8bit 表示最大数值 2^8 = 256
2Byte = 2*8bit 表示最大数值 2^16 = 65536 = 6,5536(约6千) = 65,536
4Byte = 4*8bit 表示最大数值 2^32 = 4294967296 = 42,9496,7296(约42亿) = 4,294,967,296

32位机器,地址4个字节表示,寻址就是42,9496,7296(约42亿),所以内存最多可以用4G,但不是所有地址都用于内存,所以内存最大支持会小于4G。

你可能感兴趣的:(算法)