数据结构(3)——二分法查找法
2013-09-02 14:03
141 查看
二分法查找(Binary Search)
如何从数组里找一个元素的位置?如果排列是无序的,我们只能从头到尾找,但如果排列是有序的,我们则可以用别的更好的方法,二分查找法就类似我们在英汉词典里找一个单词的方法。如下图所示(假如我们要查找的数字是“88”):
下面我给出了一段demo代码,来演示二分查找法比顺序查找快多少,代码为了方便起见,初始化有序表的时候填入的数字都是均匀的,而事实上数字可以不均匀。你可以调整一下代码中TABLE_SIZE的值,从500,调到5000,再调到10000,再调到30000……你会发觉两者差距越来越明显。我在第一篇的地方提到二分查找法的复杂度为Ο(logn),而顺序查找的复杂度为Ο(n),当n越来越大时候,Ο(logn)的优势也就越来越明显,当然了,前提是“有序”,才可用二分查找法。
#include "stdio.h"
#include "time.h"
#define TABLE_SIZE 50000
//returns the position, -1 means failed.
int SequenceSearch(int *pArray, int iArraySize, int iVal)
{
int i;
for(i=0; i<iArraySize; i++)
{
if(pArray[i]==iVal)
return i;
}
return -1;
}
//returns the position, -1 means failed.
int BinarySearch(int *pArray, int iArraySize, int iVal)
{
int iLeft = 0;
int iRight = iArraySize-1;
while(iLeft<=iRight)
{
int iMiddle = (iLeft+iRight)/2;
if(iVal < pArray[iMiddle])
{
iRight = iMiddle-1;
}
else if(iVal > pArray[iMiddle])
{
iLeft = iMiddle+1;
}
else
return iMiddle;
}
return -1;
}
int main(int argc, char* argv[])
{
//make the table
int table[TABLE_SIZE];
int i;
for(i=0; i<TABLE_SIZE; i++)
{
table[i] = i*2;
}
clock_t ctBegin = clock();
//Test sequence search
for(i=0; i<TABLE_SIZE; i++)
{
SequenceSearch(table, TABLE_SIZE, i*2);
}
clock_t ctEnd = clock();
printf("SequenceSearch takes %d clocks.\n", ctEnd-ctBegin);
//Test binary search
ctBegin = clock();
for(i=0; i<TABLE_SIZE; i++)
{
BinarySearch(table, TABLE_SIZE, i*2);
}
ctEnd = clock();
printf("BinarySearch takes %d clocks.\n", ctEnd-ctBegin);
return 0;
}
如何从数组里找一个元素的位置?如果排列是无序的,我们只能从头到尾找,但如果排列是有序的,我们则可以用别的更好的方法,二分查找法就类似我们在英汉词典里找一个单词的方法。如下图所示(假如我们要查找的数字是“88”):
下面我给出了一段demo代码,来演示二分查找法比顺序查找快多少,代码为了方便起见,初始化有序表的时候填入的数字都是均匀的,而事实上数字可以不均匀。你可以调整一下代码中TABLE_SIZE的值,从500,调到5000,再调到10000,再调到30000……你会发觉两者差距越来越明显。我在第一篇的地方提到二分查找法的复杂度为Ο(logn),而顺序查找的复杂度为Ο(n),当n越来越大时候,Ο(logn)的优势也就越来越明显,当然了,前提是“有序”,才可用二分查找法。
#include "stdio.h"
#include "time.h"
#define TABLE_SIZE 50000
//returns the position, -1 means failed.
int SequenceSearch(int *pArray, int iArraySize, int iVal)
{
int i;
for(i=0; i<iArraySize; i++)
{
if(pArray[i]==iVal)
return i;
}
return -1;
}
//returns the position, -1 means failed.
int BinarySearch(int *pArray, int iArraySize, int iVal)
{
int iLeft = 0;
int iRight = iArraySize-1;
while(iLeft<=iRight)
{
int iMiddle = (iLeft+iRight)/2;
if(iVal < pArray[iMiddle])
{
iRight = iMiddle-1;
}
else if(iVal > pArray[iMiddle])
{
iLeft = iMiddle+1;
}
else
return iMiddle;
}
return -1;
}
int main(int argc, char* argv[])
{
//make the table
int table[TABLE_SIZE];
int i;
for(i=0; i<TABLE_SIZE; i++)
{
table[i] = i*2;
}
clock_t ctBegin = clock();
//Test sequence search
for(i=0; i<TABLE_SIZE; i++)
{
SequenceSearch(table, TABLE_SIZE, i*2);
}
clock_t ctEnd = clock();
printf("SequenceSearch takes %d clocks.\n", ctEnd-ctBegin);
//Test binary search
ctBegin = clock();
for(i=0; i<TABLE_SIZE; i++)
{
BinarySearch(table, TABLE_SIZE, i*2);
}
ctEnd = clock();
printf("BinarySearch takes %d clocks.\n", ctEnd-ctBegin);
return 0;
}
相关文章推荐
- 图解数据结构(4)——二分法查找法
- 图解数据结构(4)——二分法查找法
- 图解数据结构(4)——二分法查找法
- 图解数据结构(4)——二分法查找法
- PL/SQL Developer导入导出表结构和表数据
- 数据结构实验3-带头结点的单链表
- 数据结构——表
- pl/sql导出表结构和表数据
- 18、数据结构笔记之十八链表实现稀疏矩阵
- Nginx基础数据结构
- mysql在线修改表结构大数据表的风险与解决办法归纳
- 3344-->数据结构实验之二叉树五:层序遍历
- 自考之数据结构思维导图
- 数据结构与算法 - 数组
- 数据结构基础之一
- mysql导出数据库&数据表的结构和数据
- C语言-数据结构-双链表插入查找
- 有2个表,结构相似,有一个字段关联,现在怎么把A表的数据添加到B表中,条件是A表不在B表的数据?? 请各位高手多多指点,是oracle的数据库
- 数据结构之数组
- 根据EXCEL文件各数据表结构定义中创建ER图实体对象