meili 发表于 2022-10-21 20:47:17

信息学竞赛常用算法与策略:查找 标签:信息学

<p><strong>优学合肥奥数网讯:信息学竞赛常用算法与策略:查找</strong>。</p><p>查找 是在数据结构中查找指定值的结点。</p><p><strong>5.1 顺序查找</strong></p><p>1.顺序查找的思想是是:</p><p>将查找值顺序逐个与结点值进行比较,相等即为查找成功,否则查找失败.</p><p>程序如下:</p><p>program sxcz;</p><p>const n=7;</p><p>type</p><p>arr=array of integer;</p><p>var x1,i:integer;</p><p>a:arr;</p><p>b:boolean;</p><p>place:integer;</p><p>procedure search(r:arr;m,x:integer; var found:boolean;var p:integer);</p><p>begin</p><p>p:=1;found:=false;</p><p>while(p<=m) and not found do</p><p>if r=x then found:=true else p:=p+1;</p><p>end;</p><p>begin</p><p>write('Enter array:');</p><p>for i:=1 to n do read(a);</p><p>writeln;</p><p>write('Enter search data:');</p><p>read(x1);</p><p>search(a,n,x1,b,place);</p><p>if b then begin writeln('yes');writeln('Place of',x1:5,'is:',place); end</p><p>else writeln('no');</p><p>end.</p><p><strong>5.2 二分查找</strong></p><p>1.二分查找的基本思想:首先将结点按关键字排序,其次将查找值与中间位置的值比较,相等,查找成功;不等,则中间数据大于或小于查找值,无论怎样查找将在一半的数据中查找。</p><p>2.例:输入序列数据查找指定值.</p><p>程序:</p><p>program sxcz;</p><p>const n=7;</p><p>type</p><p>arr=array of integer;</p><p>var x1,i:integer;</p><p>a:arr;</p><p>place:integer;</p><p>procedure paixv(var r:arr;m:integer);</p><p>var k,j,i,t:integer;</p><p>begin</p><p>k:=m;</p><p>while k>0 do</p><p>begin</p><p>j:=k-1;k:=0;</p><p>for i:=1 to j do</p><p>if r>r then</p><p>begin t:=r;a:=r;r:=t;k:=i;end;</p><p>end;</p><p>end;</p><p>procedure search(r:arr;m,x:integer; var p:integer);</p><p>var low,high,mid:integer;</p><p>begin</p><p>p:=0;low:=1;high:=m;</p><p>while low<=high do</p><p>begin</p><p>mid:=(low+high) div 2;</p><p>if x>r then low:=mid+1 else</p><p>if x<r then high:=mid-1 else</p><p>begin p:=mid;exit;end;</p><p>end;</p><p>end;</p><p>begin</p><p>write('Enter array:');</p><p>for i:=1 to n do read(a);</p><p>writeln;</p><p>write('Enter search data:');</p><p>read(x1);</p><p>paixv(a,n);</p><p>search(a,n,x1,place);</p><p>if place<>0 then writeln('yes') else writeln('no');</p><p>end.</p><p><strong>5.3 二叉排序树查找</strong></p><p>因为二叉排序树的左子树若不为空则左子树的所有结点的值均小于它的根结点的值,而右子树若不为空,则右子树的所有结点的值均不小大于它的根结点的值,根据这个性质查找算法如下:</p><p>program pxtree;</p><p>const</p><p>a:array of integer=(10,18,3,8,12,2,7,3);</p><p>type point=^nod;</p><p>nod=record</p><p>w:integer;</p><p>right,left:point ;</p><p>end;</p><p>var root,first:point;k:boolean;i,x:integer;</p><p>procedure maketr(d:integer;var p:point);</p><p>begin</p><p>if p=nil then</p><p>begin</p><p>new(p);</p><p>with p^ do begin w:=d;right:=nil;left:=nil end;</p><p>if k then begin root:=p; k:=false end;</p><p>end</p><p>else with p^ do if d>=w then maketr(d,right) else maketr(d,left);</p><p>end;</p><p>function searchtr(x:integer;p:point):boolean;</p><p>begin</p><p>if p=nil then searchtr:=false</p><p>else if x=p^.w then searchtr:=true</p><p>else if x<p^.w then searchtr:=searchtr(x,p^.left)</p><p>else searchtr:=searchtr(x,p^.right);</p><p>end;</p><p>begin</p><p>first:=nil;k:=true;</p><p>for i:=1 to 8 do maketr(a,first);</p><p>write('want find data x:');read(x);</p><p>if searchtr(x,first) then writeln('yes') else writeln('No');</p><p>end.</p><p><strong>5.4 哈希(Hash)表</strong></p><p>以上讲的查找方法基于比较的,查找效率依赖比较次数,其实理想的查找希望不经比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,这样查找k时,只要根据这个对应关系f找到给定值k的像f(k)。这种对应关系f叫哈希(hash)函数。按这种思想建立的表叫哈希表(也叫散列表)。哈希表存取方便但存储时容易冲突(collision):即不同的关键字可以对应同一哈希地址。如何确定哈希函数和解决冲突是关键。</p><p>1.哈希函数的构造方法</p><p>直接定址法:H(k)=k 或H(k)=a*k+b(线形函数)</p><p>如:人口数字统计表</p><p>地址 1 2 3 ... 100</p><p>年龄 1 2 3 ... 100</p><p>人数 672023 244 ... 4</p><p>当给定值k=84,则首先和a比在依次和a,a比结果a=84查找成功。</p><p>当给定值k=38,则首先和a比,再和a比,由于a没有,查找不成功,表中不存在关键字等于38的记录。</p><p><strong>5.5 查找第k小元素</strong></p><p>查找第k小元素即在n个元素中(未排序)找到第k小的元素。方法同快速排序,采用递归方式。</p><p>程序如下:</p><p>program kspv;</p><p>const n=7;</p><p>type</p><p>arr=array of integer;</p><p>var</p><p>b:arr;</p><p>i,k:integer;</p><p>function p(s,t:integer):integer;</p><p>var i,j,t1,x:integer;</p><p>begin</p><p>i:=s;j:=t;x:=b;</p><p>repeat</p><p>while (b>=x) and (j>i) do j:=j-1;</p><p>if j>i then begin t1:=b; b:=b;b:=t1;end;</p><p>while (b<=x) and (i<j) do i:=i+1;</p><p>if i<j then begin t1:=b;b:=b;b:=t1; end</p><p>until i=j;</p><p>b:=x;</p><p>p:=i;</p><p>end;</p><p>function find(s,t,k:integer):integer;</p><p>var p1,q:integer;</p><p>begin</p><p>if s=t then find:=b else</p><p>begin</p><p>p1:=p(s,t);</p><p>q:=p1-s+1;</p><p>if k<=q then find:=find(s,p1,k) else find:=find(p1+1,t,k-q);</p><p>end;</p><p>end;</p><p>begin</p><p>write('input data:');</p><p>for i:=1 to n do read(b);readln;</p><p>write('input k:');read(k);</p><p>write('output data:');</p><p>writeln('kthsmall:=',find(1,n,k));</p><p>end.</p><p>关于合肥市青少年信息学竞赛更多的信息,请关注优学合肥奥数网“<strong>青少年信息学竞赛</strong>”频道。</p><p>信息学竞赛常用算法与策略:排序</p><p>信息学竞赛常用算法与策略:回溯</p><p>信息学竞赛常用算法与策略:递归</p><p>信息学竞赛常用算法与策略:算法的概念</p><p><strong>更多精彩内容推荐>></strong></p>
页: [1]
查看完整版本: 信息学竞赛常用算法与策略:查找 标签:信息学