求真百科欢迎当事人提供第一手真实资料,洗刷冤屈,终结网路霸凌。

查找查看源代码讨论查看历史

事实揭露 揭密真相
跳转至: 导航搜索
查找

查找,在计算机科学中定义为:在一些(有序的/无序的)数据 元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找。也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录数据元素

基本信息

中文名称 查找 [1] 拼音 cházhǎo

英译 [search for;scour]

查找1.jpg

解释 彻底考查或搜寻 [2]

汉语词语

【词目】查找

【拼音】cházhǎo

【英译】[search for;scour]

【释义】彻底考查或搜寻

【示例】查找文件。

查找2.jpg

信息技术名词

在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找。也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元素。

Windows 日记本的一个功能,可用于搜索便笺文件。

英文词组:look up

网页和文件中使用ctrl+f弹出查找框 输入要查找的文字即可找到查找项

计算机算法

顺序查找

⒈顺序查找的思想是:

查找3.jpg

将查找值顺序逐个与结点值进行比较,相等即为查找成功,否则查找失败.

程序(Pascal)如下:

program sxcz;

const n=7;

type

arr=array[1..n] of integer;

var x1,i:integer;

查找4.jpg

a:arr;

b:boolean;

place:integer;

procedure search(r:arr;m,x:integer; var found:boolean;var p:integer);

begin

p:=1;found:=false;

while(p<=m) and not found do

if r[p]=x then found:=true else p:=p+1;

查找5.jpg

end;

begin

write('Enter array:');

for i:=1 to n do read(a[i]);

writeln;

write('Enter search data:');

read(x1);

search(a,n,x1,b,place);

查找6.jpg

if b then begin writeln('yes');writeln('Place of',x1:5,'is:',place); end

else writeln('no');

end.

二分查找

⒈二分查找的基本思想:首先将结点按关键字排序,其次将查找值与中间位置的值比较,相等,查找成功;不等,则中间数据大于或小于查找值,无论怎样查找将在一半的数据中查找。

⒉例:输入序列数据查找指定值.

程序(Pascal):

查找7.jpg

program sxcz;

const n=7;

type

arr=array[1..n] of integer;

var x1,i:integer;

a:arr;

place:integer;

procedure paixv(var r:arr;m:integer);

查找8.jpg

var k,j,i,t:integer;

begin

k:=m;

while k>0 do

begin

j:=k-1;k:=0;

for i:=1 to j do

if r[i]>r[i+1] then

查找9.jpg

begin t:=r[i];a[i]:=r[i+1];r[i+1]:=t;k:=i;end;

end;

end;

procedure search(r:arr;m,x:integer; var p:integer);

var low,high,mid:integer;

begin

p:=0;low:=1;high:=m;

while low<=high do

查找0.jpg

begin

mid:=(low+high) div 2;

if x>r[mid] then low:=mid+1 else

if x<r[mid] then high:=mid-1 else

begin p:=mid;exit;end;

end;

end;

begin

查找00.png

write('Enter array:');

for i:=1 to n do read(a[i]);

writeln;

write('Enter search data:');

read(x1);

paixv(a,n);

search(a,n,x1,place);

if place<>0 then writeln('yes') else writeln('no');

查找10.jpg

end.

二叉排序树查找

因为二叉排序树的左子树若不为空则左子树的所有结点的值均小于它的根结点的值,而右子树若不为空,则右子树的所有结点的值均不小大于它的根结点的值,根据这个性质查找算法如下(Pascal):

program pxtree;

const

a:array[1..8] of integer=(10,18,3,8,12,2,7,3);

type point=^nod;

nod=record

查找-.jpg

w:integer;

right,left:point ;

end;

var root,first:point;k:boolean;i,x:integer;

procedure maketr(d:integer;var p:point);

begin

if p=nil then

查找=.jpg

begin

new(p);

with p^ do begin w:=d;right:=nil;left:=nil end;

if k then begin root:=p; k:=false end;

end

else with p^ do if d>=w then maketr(d,right) else maketr(d,left);

end;

查找`.jpg

function searchtr(x:integer;p:point):boolean;

begin

if p=nil then searchtr:=false

else if x=p^.w then searchtr:=true

else if x<p^.w then searchtr:=searchtr(x,p^.left)

else searchtr:=searchtr(x,p^.right);

end;

begin

first:=nil;k:=true;

查找``.jpg

for i:=1 to 8 do maketr(a[i],first);

write('want find data x:');read(x);

if searchtr(x,first) then writeln('yes') else writeln('No');

end.

哈希(Hash)表

T018967cc2dbcfb309b.jpg

以上讲的查找方法基于比较的,查找效率依赖比较次数,其实理想的查找希望不经比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,这样查找k时,只要根据这个对应关系f找到给定值k的像f(k)。这种对应关系f叫哈希(hash)函数。按这种思想建立的表叫哈希表(也叫散列表)。哈希表存取方便但存储时容易冲突(collision):即不同的关键字可以对应同一哈希地址。如何确定哈希函数和解决冲突是关键。

⒈哈希函数的构造方法

直接定址法:H(k)=k 或H(k)=a*k+b(线形函数)

如:人口数字统计表

地址

1

2

3

T01a63d43f77a5611cc.jpg

...

100

年龄

1

2

3

...

100

人数

T018daf44e5c60bc8b5.png

67

3533

244

...

4

数字分析法:取关键字的若干数位组成哈希地址

如:关键字如下:若哈希表长为100则可取中间两位10进制数作为哈希地址。

81346532

T0120ac4073f1966a6b.jpg

81372242

81387422

81301367

81322817

81338967

81354157

81368537

平方取中法:关键字平方后取中间几位数组成哈希地址

T015eab42b92bb6c0d1.jpg

折叠法:将关键数字分割成位数相同的几部分(最后一部分的位数可以不同)然后取几部分的叠加和(舍去进位)作为哈希地址。

除留余数法:取关键字被某个不大于表长m的数p除后所得的余数为哈希地址。

H(k)=k mod p p<=m

随机数法:H(k)=rondom(k)。

⒉处理冲突的方法

假设地址集为0..n-1,由关键字得到的哈希地址为j(0<=j<=n-1)的位置已存有记录,处理冲突就是为该关键字的记录找到另一个"空"的哈希地址。在处理中可能得到一个地址序列Hi i=1,2,...k

0<=Hi<=n-1),即在处理冲突时若得到的另一个哈希地址H1仍发生冲突,再求下一地址H2,若仍冲突,再求H3...。怎样得到Hi呢?

开放定址法:Hi=(H(k)+di) mod m (H(k)为哈希函数;m为哈希表长;di为增量序列)

T0130029a5d587b01ca.jpg

当di=1,2,3,... m-1 时叫线性探测再散列。

当di=1,-1,2,-2,3,-3,...,k,-k时叫二次探测再散列。

当di=random(m)时叫伪随机探测序列。

例:长度为11的哈希表关键字分别为17,60,29,哈希函数为H(k)=k mod 11,第四个记录的关键字为38,分别按上述方法添入哈希表的地址为8,4,3(随机数=9)。

再哈希法:Hi=RHi(key) i=1,2,...,k,其中RHi均为不同的哈希函数。

链地址法:这种方法很象基数排序,相同的地址的关键字值均链入对应的链表中。

建立公益区法:另设一个溢出表,不管得到的哈希地址如何,一旦发生冲突,都填入溢出表。

⒊哈希表的查找

当给定值k=84,则首先和a[6]比在依次和a[7],a[8]比结果a[8]=84查找成功。

当给定值k=38,则首先和a[12]比,再和a[13]比,由于a[13]没有,查找不成功,表中不存在关键字等于38的记录。

查找第k小元素

查找第k小元素即在n个元素中(未排序)找到第k小的元素。方法同快速排序,采用递归方式。

程序如下(Pascal):

program kspv;

const n=7;

type

arr=array[1..n] of integer;

var

b:arr;

i,k:integer;

function p(s,t:integer):integer;

var i,j,t1,x:integer;

begin

i:=s;j:=t;x:=b[i];

repeat

while (b[j]>=x) and (j>i) do j:=j-1;

if j>i then begin t1:=b[i]; b[i]:=b[j];b[j]:=t1;end;

while (b[i]<=x) and (i<j) do i:=i+1;

if i<j then begin t1:=b[j];b[j]:=b[i];b[i]:=t1; end

until i=j;

b[i]:=x;

p:=i;

end; function find(s,t,k:integer):integer;

var p1,q:integer;

begin

if s=t then find:=b[s] else

begin

p1:=p(s,t);

q:=p1-s+1;

if k<=q then find:=find(s,p1,k) else find:=find(p1+1,t,k-q);

end;

end;

begin

write('input data:');

for i:=1 to n do read(b[i]);readln;

write('input k:');read(k);

write('output data:');

writeln('kthsmall:=',find(1,n,k));

end.

参考来源