【算法设计-散列表】散列表的直接定址法与位向量

位向量(bit vector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少的多。用一个位向量来表示一个包含不同元素的动态集合。字典操作的运行时间为0(1)

代码:

#include <stdio.h>

#include <stdlib.h>

#define INT_BIT 32

typedef struct {

unsigned int *table;

int size;

} BitMap;

BitMap * bitmap_create(int max)

{

BitMap *bitmap = (BitMap *)malloc(sizeof(BitMap));

bitmap->size = max / INT_BIT + 1;

printf("bitmap->size=%d",bitmap->size);

bitmap->table =(unsigned int *) calloc(sizeof(int), bitmap->size);

return bitmap;

}

//void bitmap_insert(BitMap *bitmap, int key)

//{

//    bitmap->table[key  /  INT_BIT] |= (1 << (key % INT_BIT));

//}

//

//void bitmap_delete(BitMap *bitmap, int key)

//{

//    bitmap->table[key  /  INT_BIT] &= ~(1 << (key % INT_BIT));

//}

//

//int bitmap_search(BitMap *bitmap, int key)

//{

//    return bitmap->table[key /  INT_BIT] & (1 << (key % INT_BIT));

//}

void bitmap_insert(BitMap *bitmap,int key)

{

bitmap->table[key/INT_BIT]|=1<<(key%INT_BIT);

}

void bitmap_delete(BitMap *bitmap,int key)

{

bitmap->table[key/INT_BIT]&=~(1<<(key%INT_BIT));

}

int bitmap_search(BitMap *bitmap,int key)

{

int m=bitmap->table[key/INT_BIT]&(1<<(key%INT_BIT));

return m;

}

void bitmap_print(BitMap *bitmap)

{

printf("-----\n");

int i;

for (i = 0; i < bitmap->size; i++)

if (bitmap->table[i] != 0)

printf("%d: %d\n ", i, bitmap->table[i]);

printf("-----\n");

}

int main(void)

{

BitMap *bitmap = bitmap_create(1024);

bitmap_insert(bitmap, 15);

bitmap_delete(bitmap, 15);

bitmap_insert(bitmap, 520);

bitmap_insert(bitmap, 900);

bitmap_print(bitmap);

printf("%d\n", bitmap_search(bitmap, 68));

printf("%d\n", bitmap_search(bitmap, 15));

printf("%d\n", bitmap_search(bitmap, 520));

printf("%d\n", bitmap_search(bitmap, 900));

return 1;

}

结果:

结果当中0 0是表示没有这两个数字。256表示是第8位是1的这个特征存储了520这个数字。该算法不能正确表示出来这个数字。这个是缺点。

应用:

位向量可以利用少量的空间保存大量的数据。

假如1M的空间一共可以用32位寻址来表示。那可以利用这个性质转换到直接定址法中,一个不同的地址可以保存一个数,也就是通过01向量法来表示出这个数字来。一共可以表示2^32个数。所以腾讯有一道面试题目:给几十万个不同的数字,然后没有排序,给你一个数字M,怎样判断这几十万个数字里面是不是有这个M,就可以通过位向量方法来解决。

时间: 2024-10-29 13:31:05

【算法设计-散列表】散列表的直接定址法与位向量的相关文章

散列表的C语言实现-开放定址法

头文件: #ifndef __HASHTABLE_H #define __HASHTABLE_H /*********************(平方)开放定址散列法***************/ //如果有冲突发生,那么就尝试另外的单元,直到找到空的单元为止 typedef unsigned int index; typedef index position; typedef int ElementType; #define MINTABLESIZE 5 struct hashTable; t

跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])

跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据]) 写了几个月,总算有点盼头了,最终要从后台取得数据了.后台的spring mvc 和 service 仅仅能简单的说说了,里面加了几十个类.有兴趣的下载了源代码自己看.以下画张通用的模块列表取数据的流程,这个流程是适用于全部的模块.我这个后台处理程序也是对全部的模块进行统一处理,包含数据查找,新增,改动,删除都是同样的. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamZvaw==

算法前戏 递归 二分查找 列表查找

一.递归 概念: 函数直接或者间接的调用自身算法的过程,则该函数称为递归函数.在计算机编写程序中,递归算法对解决一大类问题是十分有效的. 特点: ①递归就是在过程或者函数里调用自身. ②在使用递归策略时,必须有一个明显的结束条件,称为递归出口.问题规模相比上次递归有所减少, ③递归算法解题通常显得很简洁,但递归算法解题的效率较低.所以一般不倡导使用递归算法设计程序. ④在递归调用的过程当中系统的每一层的返回点.局部变量等开辟了栈来存储.递归函数次数过多容易造成栈溢出等. 所以一般不倡导用递归算法

跟我一起学extjs5(38--单个模块的设计[6取得模块列表数据])

跟我一起学extjs5(38--单个模块的设计[6取得模块列表数据]) 上一节中做好了前后台的程序,现在来看看取得数据的运行过程.在菜单中选择 "系统管理"--"模块分组".就可以看到下图,在渲染后grid后,会显示数据. 来看看ajax取得数据的url和数据. url的信息: Remote Address:[::1]:8888 Request URL:http://localhost:8888/app/rest/module/fetchdata.do?_dc=14

常用算法设计技术总结

算法,即计算的方法,使用计算的思想.方法.工具和技术来实现问题求解的思路和途径.计算机提供了计算的能力和硬件设施:算法则提供了计算的思想和软件技术,更好地发挥计算机的潜能. —— 引 有人说,算法无用,这种观点就如同盲人看不到花开就说世界上没有花一样,是一个长眼睛的人无论如何也难以接受的.举个简单的例子,假如你要对1000,000条记录进行排序,你的计算机每秒可处理1000,000 条记录, 那么, 如果你选择 O(nlogn)的快速排序,所花时间大约是 log2(1000000) = 20s,

AACOS:基于编译器和操作系统内核的算法设计与实现

AACOS:基于编译器和操作系统内核的算法设计与实现 [计算机科学技术] 谢晓啸 湖北省沙市中学 [关键词]: 编译原理,操作系统内核实现,算法与数据结构,算法优化 0.索引 1.引论 1.1研究内容 1.2研究目的 1.3研究提要 正文 2.1研究方法 2.2编译器部分 2.2.1从计算器程序中得到的编译器制作启示 2.2.2在编译器中其它具体代码的实现 2.2.3编译器中栈的高级应用 2.2.3编译器中树的高级应用 2.2.4编译器与有限状态机 2.3操作系统内核部分 2.3.1操作系统与底

“谁是大V”算法设计 (Map-Reduce TopN)

作业设计与资料 链接: http://pan.baidu.com/s/1o6MJTyi 密码: 628d 一.     作业要求   根据关注列表relsample.json文件,设计MapReduce算法得到被关注次数最多的前十人,即寻找谁是大V. 二.     算法设计   第一个Mapper用于解析json文件: 从relsample.json文件中解析出ids列表的内容,即每个人所关注的人的列表.输出的value为列表中的每一项,k为one. 对应的文件为\src\myMapper\re

一致性哈希算法设计

一致性哈希算法设计思路: 运行结果: [email protected]:/data/code/cwork/chash:./chash ----vsrvname = 192.168.100.1:3306-vm1,hkey =126515------ ----vsrvname = 192.168.100.1:3306-vm2,hkey =77752------ ----vsrvname = 192.168.100.1:3306-vm3,hkey =47584------ ----vsrvname

数据结构--开放定址法解决散列冲突时几种探测法的比较

开放定址法解决散列冲突时主要有线性探测法,平方探测法和双散列法,以下代码通过插入大量随机数,来统计几种探测法产生冲突的次数. #include<iostream> using namespace std; #define MinTablesize 10 #define Num 3000 typedef unsigned int Index; typedef Index Position; struct Hashtal; typedef struct Hashtal *Hashtable; in