浅谈竞赛中哈希表的应用一内容摘要:
的写了一个(因为越是随意的,就越是随机的。 ),定位函数是这样的: function locate(var a,b,c,d:longint):longint。 var t:longint。 i:integer。 begin t:=r[b]*10037+r[c]*5953+r[d]*2999。 {用 3 堵墙的值任意乘大素数相加再取余数,使得结果分布比较随机,也就比较均匀 } t:=t mod p。 i:=0。 while (e[a,(t+i)mod p,1]0)and(e[a,(t+i)mod p,1]r[b]) do if (e[a,(t+i)mod p,2]r[c])or(e[a,(t+i)mod p,3]r[d]) then inc(i)。 {线性重新散列 } locate:=(t+i)mod p。 end。 但是后来发现完全没有必要这样做,这样的哈希函数在计算 t 的时候浪费了很多时间(不过数据规模不是很大,所以这点不十分明显),而且素数起到的作用也不应当是这样的。 其实让 r[b],r[c],r[d] 组成 n 进制数就完全能够达到目的了,加入了素数不仅是小规模数据计算浪费时间,对大数据最后结果的分布平均也没有起到比 n 进制数更多的作用。 因此改为 t:=r[b]*sqr(n)+r[c]*n+r[d]。 当然肯定会有更好的哈希函数的。 小结 第一个例子,乍一看与哈希表毫无关系;第二个例子叙述比较复杂,但是经过仔细分析,发现问题的本质都是确定 某个元素是否在给定集合中 ,这正是哈希表的特点。 所以,不论题目的表面看起来如何,只要本质是需要 高效的数据检索,哈希表通常就是最好的选择。 另外,这两个例子都在原来哈希表的基础上作了一些变化。 第一个例子加入了纪录某个值出现次数的域,第二个例子加入了纪录所有墙的情况以及原节点编号的域。 虽然都只是很小的变化,但是却给问题的解决带来了不小的方便。 因此我们得到提示:哈希表虽然有标准的操作,但也不是一成不变的,需要具体问题具体分析,根据题目的要求和特点作出相应变化。 5. 总结 本文介绍了有关哈希表方面的内容,分析了它的特点和优点,指出了应用需要注意的问题,并且重点举了几个例子来说明它在竞赛中的应用。 希望读者读完本文能够对哈希表有更全面的了解,并能在竞赛中应用自如。 参考文献: 1. 《算法与数据结构(第二版)》 付清祥 王晓东 编著 2. 《奥赛兵法信息学(计算机)》 朱全民 主编 3. 《 SGOI8 烦恼的设计师 解题报告》 曙光网信息学 4. 《 Data Structures》 USACO Training Gate 附录: 这是我第一次写论文,水平很有限,希望大家指出我的缺点和不足。 我的邮箱 下面是所有前面提到的程序。 其中只有 SGOI8 Flowers 的程序是网上提供的标程,其余的都是我自己写的,并且已经通过所有测试数据。 1. 哈希表的程序 program subset。 const max=15889。 var fin,fout:text。 a,b,s,j:longint。 index:array[0..max1]of longint。 t:real。 function locate(t:longint):longint。 var tmp:longint。 begin tmp:=t mod max。 while (index[tmp]0)and(index[tmp]t) do tmp:=(tmp+1) mod max。 locate:=tmp。 end。 procedure int(t:longint)。 begin index[locate(t)]:=t。 end。 function member(t:longint):boolean。 begin if index[locate(t)]=t then member:=true else member:=false。 end。 procedure init。 var shu,i:longint。 begin assign(fin,39。 39。 )。 assign(fout,39。 39。 )。 reset(fin)。 rewrite(fout)。 close(fout)。 fillchar(index,sizeof(index),0)。 read(fin,a)。 for i:=1 to a do begin read(fin,shu)。 int(shu)。 end。 end。 procedure main。 var i,shu:longint。 begin read(fin,b)。 s:=0。 for i:=1 to b do begin read(fin,shu)。 if not member(shu) then inc(s)。 end。 end。 procedure out。 begin writeln(s)。 close(fin)。 end。 begin t:=meml[$40:$6C]。 for j:=1 to 50 do begin init。 main。 out。 end。 t:=meml[$40:$6C]t。 writeln(t/:0:8)。 end. 2. 快速排序 +二分查找的程序 program subset。 const max=16101。 var a,b,s,j:longint。 da:array[1..max]of longint。 fin:text。 t:real。 procedure init。 var i:longint。 begin assign(fin,39。 39。 )。 reset(fin)。 read(fin,a)。 for i:=1 to a do read(fin,da[i])。 end。 procedure sort(m,n:longint)。 var p:longint。 function locate:longint。 var value,i,j,temp:longint。 begin value:=da[(m+n) div 2]。 i:=m1。 j:=n+1。 while true do begin repeat inc(i)。 until da[i]=value。 repeat dec(j)。 until da[j]=value。 if ij then begin temp:=da[i]。 da[i]:=da[j]。 da[j]:=temp。 end else begin if Ij then locate:=j else locate:=j1。 exit。 end。 end。 end。 begin if mn then begin p:=locate。 sort(m,p)。 sort(p+1,n)。 end。 end。 procedure main。 var i,x:longint。 function member(x:longint):boolean。 var p,e,mid:longint。 begin p:=1。 e:=a。 mid:=(p+e) div 2。 while (pmid)and(emid)and(da[mid]x) do begin if x=da[mid] then begin member:=true。 exit。 end。 if xda[mid] then begin e:=mid。 mid:=(p+e)div 2。 end else begin p:=mid。 mid:=(p+e)div 2。 end。 end。 if (da[p]=x)or(da[e]=x)or(da[mid]=x) then member:=true else member:=false。 end。 begin read(fin,b)。 s:=0。 for i:=1 to b do begin read(fin,x)。 if not member(x) then inc(s)。 end。 end。 procedure out。 begin writeln(s)。 close(fin)。 end。 begin t:=meml[$40:$6C]。 for j:=1 to 50 do begin init。 sort(1,a)。 main。 out。 end。 t:=meml[$40:$6C]t。 writeln(t/:0:8)。 end. 3. 《找名字》的程序 program namenum。 const empty:string[12]=39。 39。 value:array[2..9,1..3]of string=((39。 A39。 ,39。 B39。 ,39。 C39。 ), (39。 D39。 ,39。 E39。 ,39。 F39。 ), (39。 G。浅谈竞赛中哈希表的应用一
相关推荐
PB,PB=AB=2MA (1)求证 :AC∥ 平面 PMD。 (2)求直线 BD 与平面 PCD 所成的角的大小。 (3)求平面 PMD与平面 ABCD 所成的二面角 (锐角 )的大小 分析:第( 2)问 运用已知条件中的 PB⊥平面 ABCD,类比结论 3中的基本构图,将问题转化到三棱锥 P— BCD 中就能够顺利的找到问题的突破口。 第 (3)问在延长PM、 BA,使 PM、 BA
—— 启发 —— 讨论 —— 研究 ” 的教学方法,要加深其对教材的学习,有意培养分析问题和解决问题的能力,使其在质疑、解惑中智慧和能力得到充分的发展。 B 层次是水平中 等的大部分学生,对他们 的目标关键在于促使其向 A 层学生靠近,一般采取 “ 起点适当,依次讲练,分析 应用,巩固提高 ” 的教学方法, C 层次是小部分基础差、学习缺乏主动性 的学 生,对他们 主要在于保持学习积极性
行函数 y= ax2 教学时,教师在课件中做出 a 值变化时图象的变化,教学时可先向学生演示 a 取正数时的图象,然后先让学生判 断 a 取负值时的图象形状,学生经过归纳、猜想、推理等一系列思维过程之后,教师再做演示,其效果显然比直接演示更好。 当然,数学 CAI 和其他学科一样,都必须具有明确的教学目标,正确的教学内容,能体现一定的交互性、个别化,并且能充分利用多媒体技术,实现对文字、图形
)时,应当依法提请公安机关执行,工商机关予以配合,否则,不仅越权提得的证据无效,甚至有可能遭致诉讼。 四、现场检查贵在神速,要做好策划工作。 在实际中,因出勤缓慢、延误时机、检查拖拉使执法受阻的现象时有发生,要提高检查效率,实施检查之前,办案单位应分析情况,设定工作方案,明确人员分工,一是便于控制现场,及时发现违法物品和相关证据,二是当发现的违法物品需要实施查封、扣押等强制措施时
重难点,提高教学效率 多媒体教学以图形和动画为主要手段,同时可将图形由静变动,由小变大或由大变小,由慢变快或由快变慢。 学生通过观察,使学生如同身临其境,不仅可以接受到大量的教学信息,而且能获得清晰明快的感受。 画面生动,图、声、文配合,能大大提高学生的兴趣,使注意力 更集中,因而提高课堂效率。 如在教《刻舟求剑》这则寓言, 其教学重难点是让学生懂得不要以静止去看待事物,否则会坏事的道理。