散列法解决1000个整数的搜索
来源:互联网 发布:动态桌面软件 编辑:程序博客网 时间:2024/05/17 22:41
/*
*散列法解决1000个整数的搜索问题(为了方便显示结果,程序中将1000改为了100)
*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#define LEN 100
typedef int dataType;
typedef struct HNode
{
dataType key; //关键字
int flag; //判断是否被赋值
}HNode;
//初始化数据
void initData(dataType data[],int len);
//打印数据
void printData(dataType data[],int len);
//在原数组中查找元素下标,找不到则返回-1
int searchInData(dataType data[],int d);
//初始化哈希表
void initHash(HNode arr[],dataType data[],int len);
//打印哈希表
void printHash(HNode arr[],int len);
//如果冲突,采用开放地址法的线性探测在散列
int getIndex(HNode arr[],int d);
//查找元素,查找成功返回1,否则返回0
int search(HNode arr[],int d);
int main()
{
int keyword;
int tempIndex;
dataType data[LEN];
HNode arr[LEN];
initData(data,LEN);
printData(data,LEN);
initHash(arr,data,LEN);
printHash(arr,LEN);
printf("\n输入要查找的整数(输入q结束):");
while(scanf("%d",&keyword))
{
tempIndex = searchInData(data,keyword);
if(tempIndex != -1)
{
printf("%d在元素数组中的下标是%d\n",keyword,tempIndex);
}
if(search(arr,keyword))
{
printf("查找成功!\n");
}
else
{
printf("查找失败!\n");
}
printf("\n输入要查找的整数(输入q结束):");
}
return 0;
}
//初始化数据
void initData(dataType data[],int len)
{
int i;
srand((unsigned)time(NULL));
for(i = 0; i < len; i++)
{
data[i] = rand();
}
}
//打印数据
void printData(dataType data[],int len)
{
int i;
printf("原始数据:");
for(i = 0; i < len; i++)
{
if(i % 10 == 0)
{
printf("\n");
}
printf("%d\t",data[i]);
}
printf("\n");
}
//在原数组中查找元素下标,找不到则返回-1
int searchInData(dataType data[],int d)
{
int i;
for(i = 0; i < LEN; i++)
{
if(data[i] == d)
{
return i;
}
}
return -1;
}
//初始化哈希表
void initHash(HNode arr[],dataType data[],int len)
{
int i;
int index;
for(i = 0; i < len; i++)
{
index = getIndex(arr,data[i]);
arr[index].key = data[i];
arr[index].flag = 1;
}
}
//打印哈希表
void printHash(HNode arr[],int len)
{
int i;
printf("Hash表中的数据:");
for(i = 0; i < len; i++)
{
if(i % 10 == 0)
{
printf("\n");
}
printf("%d\t",arr[i].key);
}
printf("\n");
}
int getIndex(HNode arr[],int d)
{
int result = 0;
result = d % LEN;
//如果冲突了
while(arr[result].flag == 1)
{
result = (result + 1) % LEN;
}
return result;
}
//查找元素,查找成功返回1,否则返回0
int search(HNode arr[],int d)
{
int circle = 0;
int index = 0;
index = d % LEN;
while(arr[index].key != d)
{
if((circle == 1) && (index == d % LEN))
break;
index = (index + 1) % LEN;
if(index >= LEN -1)
{//已经扫描到尾了
circle++;
}
}
if(arr[index].key == d)
{
return 1;
}
return 0;
}
运行结果:
/*博主寄语:如若发现错误,望指出,谢谢*/
- 散列法解决1000个整数的搜索
- 运用bitmap解决一道海量数据处理面试题:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。
- 从100亿个整数中找出最大/最小的1000个整数
- 20 个整数的和
- N个整数的最大公约数
- 丢失的第一个整数
- 解决dedeEims搜索提示“搜索小于2个字节”方案
- 请输出1000以内能被11整除的最小的6个整数和最大的6个整数
- 满大街都是这种烂题目------从100亿个整数中找出最大的1000个整数
- 今天的c++练习代码———>"欧几里德算法+函数的递归解决求2个整数的最大公约数"
- 整数能分解成若干个连续整数的和
- 整数划分问题的解决-POJ1664
- 一道整数排列题目的解决
- 动态规划解决整数划分的问题
- 2个整数的平均值-位运算
- 【C++】N 个整数的排序。
- 随机生成n个不同的整数
- 查找最小的k个整数
- iOS系统GCD学习(3):dispatch_group
- 【Boost】boost库的随机数的例子
- 句柄和指针的区别
- linux简单之美(三)
- 今天的天气很的好啊好哦
- 散列法解决1000个整数的搜索
- 01-算法分析开始
- windows7隐藏的上帝模式
- POJ 3122 Pie
- android:descendantFocusability用法简析
- EXT简单的可编辑表格
- Tokyo Cabinet 的四种数据结构
- vs中数据库的创建及连接
- 用TexturePacker将css图片合并到一个图片中