算法设计与分析结课论文
程序设计与算法分析结课论文

程序设计与算法分析结课论文在当今数字化的时代,程序设计与算法分析已经成为计算机科学领域的核心组成部分。
从智能手机中的各种应用程序,到互联网上的搜索引擎和电子商务平台,再到科学研究中的模拟和数据分析,程序设计和算法的身影无处不在。
它们不仅影响着我们的日常生活,还推动着科技的不断进步和社会的发展。
程序设计,简单来说,就是告诉计算机要做什么以及如何去做。
它涉及到使用特定的编程语言来编写指令,让计算机按照我们的意愿执行任务。
一个好的程序设计应该具有清晰的逻辑结构、易于理解和维护的代码,以及高效的性能。
而要实现这些目标,就需要对编程语言的语法、数据结构和控制结构有深入的理解。
以常见的编程语言如 Python 为例,它提供了丰富的数据类型,如整数、浮点数、字符串、列表、字典等,以及各种控制结构,如条件语句(ifelse)、循环语句(for、while)等。
通过合理地运用这些元素,我们可以编写出解决各种问题的程序。
比如,要编写一个程序计算两个数的平均值,我们可以使用以下的 Python 代码:```pythonnum1 = 5num2 = 10average =(num1 + num2) / 2print("平均值为:", average)```这只是一个简单的例子,但它展示了程序设计的基本思路:明确问题、选择合适的数据结构和算法、编写代码并进行测试。
算法分析则是对程序所使用的算法的性能进行评估和优化。
一个算法的性能通常用时间复杂度和空间复杂度来衡量。
时间复杂度表示算法运行所需的时间与输入规模之间的关系,而空间复杂度表示算法运行所需的存储空间与输入规模之间的关系。
例如,对于一个排序算法,我们可以比较冒泡排序、插入排序和快速排序的时间复杂度。
冒泡排序的时间复杂度为 O(n^2),插入排序的时间复杂度也为 O(n^2),而快速排序的平均时间复杂度为 O(nlogn)。
在处理大规模数据时,快速排序的性能通常要优于冒泡排序和插入排序。
算法设计与分析课程论文

算法设计与分析课程论文1.引言算法设计与分析是数据结构的有力补充,从中可以了解到算法设计的奥妙以及对数据结构中的数据存储结构更深层次的运用。
计算机算法设计与分析是面向设计的、处于核心地位的一门学科。
算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。
算法设计是一件非常困难的工作,常用的算法设计方法有:分治法、贪心方法、动态规划、回溯法、分枝-限界法、基本检索与周游方法、遗传算法等。
本文主要对算法设计与分析中的递归算法以及动态规划算法进行了总结、分析以及对具体问题的编程实现。
2.递归算法分析2.1递归算法简介与特点递归就是在函数或子过程的内部,直接或间接地调用自己的算法;递归算法是从下往上进行思维,需要对问题有全局的了解;在使用递归算法时,必须至少测试一个可以终止递归的条件,并且还必须对在合理的递归调用次数内未满足此类条件的情况进行处理,如果没有一个在正常情况下可以满足的条件,则过程将陷入执行无限循环的高度危险之中;递归算法的描述非常简洁而易于理解,但因重复计算和较大的堆栈消耗使递归算法的解题的运行效率较低;并不是所有的语言都支持递归,在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等不利编程的因素,所以一般不提倡用递归算法设计程序。
2.2递归过程递归过程是直接调用自己或通过一系列的过程调用语句间接调用自己的过程。
在一个过程的运行期间调用另一个过程时,在执行被调用过程之前,系统要先把所有的实在参数返回地址等信息传递给被调用的过程保存,为被调用过程的局部变量分配存储空间,将控制转移到被调用入口。
接下来从被调过程返回调用过程要保存被调用过程的计算结果,释放被调用过程的数据区,依照被调过程保存的返回地址将控制转移到调用过程。
该过程服从后调用先返回的原则。
2.3递归算法的优缺点递归算法易于理解,结构清晰,所编写的代码简洁精练,可读性好,有利于代码的维护。
算法分析与设计论文[精品文档]
![算法分析与设计论文[精品文档]](https://img.taocdn.com/s3/m/bf8a116458fb770bf68a5501.png)
算法设计与分析论文题目0-1背包问题的算法设计策略对比与分析专业班级学号姓名引言对于计算机科学来说,算法(Algorithm)的概念是至关重要的。
算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。
一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。
或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。
算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。
一个算法应该具有以下五个重要的特征:有穷性:一个算法必须保证执行有限步之后结束;确切性:算法的每一步骤必须有确切的定义;输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。
没有输出的算法是毫无意义的;可行性:算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
计算机科学家尼克劳斯-沃思曾著过一本著名的书《数据结构十算法= 程序》,可见算法在计算机科学界与计算机应用界的地位。
1 算法复杂性分析的方法介绍算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。
一个算法的复杂性的高低体现在运行该算法所需要的计算机资源的多少上面,所需的资源越多,我们就说该算法的复杂性越高;反之,所需的资源越低,则该算法的复杂性越低。
计算机的资源,最重要的是时间和空间(即存储器)资源。
因而,算法的复杂性有时间复杂性和空间复杂性之分。
不言而喻,对于任意给定的问题,设计出复杂性尽可能地的算法是我们在设计算法是追求的一个重要目标;另一方面,当给定的问题已有多种算法时,选择其中复杂性最低者,是我们在选用算法适应遵循的一个重要准则。
算法分析结课论文(分治法的应用)

前言 (1)正文 (1)2.1设计的目的和意义 (1)2.1.1设计的目的 (1)2.1.2设计的意义 (1)2.2设计的目标与总体方案 (1)2.1.1设计的目标 (1)2.1.2设计的总体方案 (2)2.3设计的方法和内容 (2)2.3.1硬件环境要求 (2)2.3.2软件环境需求 (2)2.3.3设计的流程图 (2)2.3.4设计的方法及详细内容 (2)2.3.4.1让用户输入信息 (2)2.3.4.2数据整理 (3)2.3.4.3查找数据并输出结果 (4)2.3.4.4询问用户是否继续 (5)2.4设计的创新与关键技术 (6)2.4.1设计的特点 (6)2.4.2设计的难点 (7)2.4.3软硬件调试及结果分析 (7)2.5结论 (7)致谢 (7)参考文献: (8)附录: (9)算法研究是计算机科学的核心。
近年来,算法领域去得了很多重要的进展。
这些进展包括快速算法的开发,如发明了傅里叶变换开速算法,以及不存在有效算法的本质问题的惊人发现。
这些结果点燃了计算机学者对算法研究的兴趣。
算法设计与分析已成为一个受到广泛注意的领域。
计算机的普及极大地改变了人们的生活。
目前,各行业、各领域都广泛采用了计算机的信息技术,并由此产生出开发各种应用软件的需求。
为了最少的成本、最快的速度、最好的质量开发出适合各种应用需求的软件,必须遵循软件工程的原则。
设计一个高效的程序不仅需要编程小技巧,更需要合理的数据组织和清晰高效的算法,这正是计算机科学领域数据结构与算法设计所研究的主要内容。
一些著名的计算机科学家在有关计算机科学教育的论述中认为,计算机科学是一中创造性思维活动,其教育必须面向设计。
计算机算法设计与分析正是一门面向设计,且处于计算机学科核心地位的教育课程。
通过对计算机算法系统的学习与研究,掌握算法设计的主要法方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定坚实的理论基础。
计算机算法设计与分析小论文

计算机算法设计与分析小论文摘要:算法是一个系列解决问题的清晰指令,即在有限时间内能够对一定规范的输入,能够得到所需要的输出。
如果一个算法本身是有缺陷的!那么他往往不是这个问题的最佳解决方法,可见一个算法的优劣是通过一定的准则来规定的。
通过这学期的对《计算机算法分析设计》这门课程的学习让我们充分的了解到了计算机算法的多样性和复杂性,让我们更加细心和耐心的去对待这门课程。
例如甲某要去某个地方旅游,他有很多种方案到旅游地,但是不见的每种方案都是合理最优的!这时就是需要考虑透过一定的算法来得到自己的最优路线。
所以可见算法就是以最少的成本、最快的速度、最好的质量开发出合适各种各样应用需求的软件,必须遵循软件工程的原则,设计出高效率的程序。
一个高效的程序不仅需要编程技巧,更需要合理的数据组织和清晰高效的算法。
目前我们将进行常见的算法分析设计策略介绍:1.递归算法1.1递归算法介绍:直接或间接的调用自身的算法称为递归算法。
或者说就是用自己来定义自己,不断调用自己的某一种状态。
1.2递归算法满足的条件(1)递归满足2个条件:1)有反复执行的过程(调用自身)2)有跳出反复执行过程的条件(递归出口)1.3递归例子递归例子:阶乘问题n! = n * (n-1) * (n-2) * ...* 1(n>0)//阶乘int result(int i){int sum = 0;if (0 == i)return (1);elsesum = i * result(i-1);return sum;}可见一个递归算法都有一个比较特殊的特点,那就是要先处理一些比较特殊的情况再处理递归关系。
如上例中如果是0!的话!那么他的阶乘就是1,所以先处理0!这个特殊情况,然后再调用其他的递归关系得到自己想要的阶乘。
比如当我们想要求出4!的结果那么我们就需要调用result(3)的结果而result(3)又要调用result(2)的结果!就这样直到得出答案为止。
算法分析与设计终期论文

0/1背包问题的算法分析研究【摘要】0/1背包为题是一个典型的NP问题,关于这个问题有多种不同的解法。
这里主要总结了分治、动态规划、贪心和回溯算法的设计思想,以及分别用他们解决0/1背包问题的时间和空间复杂度分析比较,总结这四种方法实现的优缺点。
我们发现用贪心算法解0/1背包问题只能得到近似最优解而不能得到真正的最优解,且在不同的约束条件下,四种算法各有优劣。
【关键字】0/1背包问题、分治法、动态规划法、贪心算法、回溯算法0/1 knapsack problem analysis algorithm【Abstract】Zero-first knapsack is a classic on the topic of NP problems on this issue there are many different solutions. Here main summary of divide-and-conquer, dynamic programming, greedy and backtracking algorithm design ideas, as well as with their zero-first knapsack problem-solving analysis and comparison of the time and space complexity, advantages and disadvantages of summing up the implementation of the four methods. We found using the greedy algorithm solution zero-first knapsack problem can only be approximate optimal solution not been real optimal solutions, and under different constraint conditions, four kinds of algorithms have their pros and cons.【Key Words】Zero-first knapsack problem, Divide and conquer, dynamic programming, greedy algorithms, backtracking algorithm目录1 引言 (3)2 问题的提出 (3)2.1问题符号化 (3)3 分治算法 (4)3.1 算法设计思想 (4)3.2 适合用分治法策略的问题 (4)3.3 算法设计步骤 (4)3.4 算法分析 (5)4 动态规划算法 (5)4.1 算法设计思想 (5)4.2 适合动态规划法解决的问题 (5)4.3 算法设计步骤 (5)4.4 用动态规划法解决0/1背包问题 (6)4.4.1 算法分析 (7)5 贪心算法 (7)5.1 算法设计思想 (7)5.2 适合用贪心算法解决的问题 (8)5.3 算法设计步骤 (8)5.4 算法分析 (8)6 回溯算法分析研究 (9)6.1 算法设计思想 (9)6.2 适合用回溯算法解决的问题 (9)6.3 算法设计步骤 (9)6.4 用回溯算法解决0/1背包问题 (9)6.4.1 算法分析 (12)7 分支限界算法分析研究 (12)7.1 算法设计思想 (12)7.2 常见的两种分支限界法 (12)7.3 用优先队列分支限界法解决0/1背包问题 (13)8 各种算法解决0/1背包问题的优缺点比较分析 (14)9对回溯算法的优化 (14)10 结束语 (16)【参考文献】 (17)1 引言计算机算法设计与分析是面向设计的、处于核心地位的一门学科。
算法的设计与分析论文

目录前言 (1)项目概况 (1)2.1开发工具简介 (1)2.2基本情况 (1)正文 (1)3.1设计的目的和意义 (1)3.2目标与总体方案 (1)3.2.1 设计目标 (1)2.2.2 工作进度安排 (1)3.3设计方法和内容 (2)3.3.1硬件环境 (2)3.3.2软件环境 (2)3.3.3设计算法的基本思想 (2)3.3.4 运行环境及所用函数解析 (4)3.4设计创新与关键技术 (5)3.5结论 (5)有关说明 (5)致谢 (5)参考文献 (6)附录: (7)前言人类已经跨入了新世纪,正在进入信息时代。
现在信息技术的应用越来越普及,不但促进了社会的高速发展,也改变着人们的工作、学习、生活和娱乐的方式以及思想观念。
随着计算机的日益普及,计算机软件无处不在。
软件在计算机的发展和应用中至关重要,在人类进入信息化社会时成为新兴信息产业的支柱。
随着人类社会的发展,随着计算机及网络技术的飞速发展,Internet应用在全球范围内日益普及,当今社会正快速向信息化社会前进,信息系统的作用也越来越大。
要熟练而又灵活的运用与操作计算机,就要用到一些程序,程序的强大又简练,主要是靠程序的思想与算法,合理的设计程序思想,运用算法,才能更加体现出程序对计算机的操作,更能体现出计算机的强大。
项目概况2.1开发工具简介C语言是国际上广泛流行的计算机高级语言,它适合作为系统描述语言,既可以用于编写系统软件,也可以用来编写应用软件。
它具有语言简洁,使用灵活,运算符丰富,数据类型丰富,生成目标代码质量高,程序执行效率高,程序可移植性好,此次设计的项目是在Microsoft Visual C++的环境下编辑。
2.2基本情况此次项目是在校机房408室和宿舍,用了14天的时间编辑出来的。
前7天在查阅资料,规划系统结构,后面的几天中,在编辑系统程序,并且调试次程序。
此项目是皇后算法,我们所学的知识有限,时间也有限,所编辑的系统比较简单。
算法设计和分析课程论文

湖南理工学院课程论文论文题目贪心法的应用课程名称算法设计与分析姓名学号专业计算机科学与技术年级学院计算机日期(2014年4月10日)课程论文评价标准贪心法的应用摘要:在解决问题的过程中,通过逐步获得最优解从而获得整体最优解的策略就是贪心策略,在已经学会在解的范围可以确定的情况下,可以采用枚举或递归策略,一一比较它们最后找到最优解;但当解的范围非常大时,枚举和递归的效率会非常低。
这时就可以考虑用贪心策略。
贪心算法没有固定的框架,算法设计的关键是贪心策略的选择,贪心策略要具有无后向性,即某阶段状态一旦确定以后,不受这个状态以后的策略的影响。
当一个问题有好几种解决方法时,贪心法应该是最好的选择之一。
本文讲述了贪心算法的含义、基本思路以及贪心算法在实例中的应用。
关键词:贪心算法;删数问题;最小生成树一、引言在平时解决问题的过程中,当一个问题就有无后向性和贪心选择性质时,贪心算法通常会给出一个简单、直观和高效的解法。
贪心算法通过一系列的选择来得到一个问题的解。
它所做的每一个选择都是当前状态下就有某种意义的最好选择,即贪心选择;并且每次贪心选择都能将问题化解为一个更小的与原问题具有相同形式的子问题。
尽管贪心算法对于很多问题不能总是产生整体最优解,但对于最短路径、最小生成树问题,以及删数问题等却可以获得整体最优解,而且所给出的算法一般比动态规划算法更为简单、直观和高效。
二、贪心算法的含义和特点(一)贪心算法的含义贪心算法是通过一系列的选择来得到问题解的过程。
贪心算法是一种能够得到某种度量意义下的最优解的分级处理方法,它总是做出在当前看来是最有的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解算法。
(二)贪心算法的特点1、从全局来看,运用贪心策略解决的问题在程序运行过程中无回溯过程,后面的每一步都是当前看似最佳的选择,这种选择依赖已作出的选择,但并不依赖未作出的选择。
2、不能保证最后求出的解是最佳的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析结课论文Hash技术学生姓名:***学号:**********专业:计算机科学与技术年级:2009级完成日期:2010年月日指导教师:***成绩:Hash技术摘要:随着科技日益发展,Hash函数的重要性越来越突出。
本文介绍了几种构造Hash 的方法,例如直接定址法、数字分析法、平方取中法、折叠法、除留余数法等,在构造Hash函数时,应当注意两点问题:(1)函数值应在1至记录总数之间。
(2)尽量避免冲突。
还介绍了几种处理Hash算法冲突的方法。
除此之外,阐明了Hash函数的优缺点和它在现实生活中的应用。
关键词:Hash函数,构造方法,应用,优缺点目录1.绪论1.1 什么是算法1.2 搜索算法2.Hash函数2.1 Hash函数的基本概念2.2 Hash函数的基本思想与一般模型2.3 Hash函数的构造3. 处理冲突的方法3.1 开放定址法3.2 再哈希法3.3 链地址法3.4 建立一个公共溢出区4. Hash算法的优劣分析5. Hash函数的应用5.1 完整性的验证5.2 数字签名5.3 认证协议5.4 加密算法6. 总结1. 绪论1.1 什么是算法算法的概念在计算机科学与技术领域几乎无处不在,在各种计算机系统的实现中,算法的设计往往处于核心的位置。
1.2 搜索算法搜索问题是计算机技术面对的基本课题之一,自20世纪70年代以来,计算机应用的主流逐渐从计算机密集型向着数据密集型转化,计算机存储和处理的数据量越来越大,结构越来越复杂,因此,对搜索算法的研究始终是人们研究的重要领域。
搜索算法与其他问题不同,它与数据结合的组织形式密切相关。
在大多数情况下,搜索算法实际上是作为某种数据类型的运算或操作而不断的被调用的,搜索算法的优劣与数据结构密切相关。
2. Hash函数2.1 Hash函数的基本概念Hash函数是把任意长度的二进制串映射到特定长度的二进制串函数,是最基本的二进制函数之一。
Hash函数也被称为“凑数函数”,但这个名称很少被采用,70年代之前也被称为散列函数,现在我们经常将其称之为Hash或译为哈什。
Hash技术是一种提供高速数据存储与检索方式的优秀技术,已有近50年的发展历史。
其中二十世纪五六十年代因汇编与编译系统的需要,Hash技术受到普遍重视,70年代以来,计算机在数据管理与人工智能领域广泛应用,大型数据库系统的设计备受关注。
由于Hash算法的期望搜索时间与数据集合的大小无关,所以在数据量很大时,其查询性能优于平衡树等搜索算法。
2.2 Hash算法的基本思想与一般模型随着对Hash函数的不断探索,子啊上世纪九十年代Hash函数逐渐趋于成熟。
Hash函数逐渐有了两个分支。
一个分支就是针对大规模字符串词典,这就是我们常见的词典。
另一个分支就是针对大规模稀疏整数集合,就是将一个大规模整数集合的所有元素映射到一个较小集合。
Hash方法的基本思想是,首先产生从可能的关键字集合(又称全域)U=[0..N-1]到存储空间(Hash表)地址集合T=[0..m-1]的一个映射函数:h:U→[0..m-1]。
于是,要存储或检索关键字为x∈U的数据项只需计算函数h(x),直接得到该数据项应在的地址。
然而对不同的关键字x,y∈U,h(x)=h(y)的情况可能出现,这种情形称为冲突(collision)。
由于一般的|U|远远大于m,冲突难以避免,因此Hash技术研究的基本问题是:(1)设计一个好的Hash函数,计算简单,而又使数据项分布均匀以减少冲突;(2)设计解决冲突的策略和算法。
集合S⊆U为实际存于Hash表中的关键字组合。
|S|=n≤N。
α=n/m称为负载因子(load factor),α值是决定哈希算法性能的主要因素。
其值小于1,且越小越浪费空间,越接近1性能越下降。
Hash算法的“散列”存储方式,使得它不能支持Minimum、Maximum、Successor、Predecessor这类的操作,而对于Search、Insert、Delete操作,不但可以支持而且有较高的性能。
从抽象数据类型(ADT)的观点来说,Hash算法用于实现字典(Dictionary)类型,实际关键字集合S为固定不变时,称为静态字典,只支持Search操作,S为可变时,即动态数据集,称为动态字典,动态字典支持搜索、插入和删除操作。
2.3 Hash函数的构造Hash函数的设计一般应能兼顾计算简单和分布均匀,在大多数应用问题中,可能的关键字集合U往往远远大于地址空间的规模。
例如以姓名字符串作为关键字,|U|=N是一个极大的值,而Hash表的长度m和实际关键字集合S(|S|=n)与N相比小得多。
因此,分布均匀的要求就是要对于h:U→(0…,m-1),S⊆U,|S|=n,使∑-=-⋂1 01|)(|miSih尽量小,其中|.|集合的势(求集合元素的个数),h1-(-i)为被h映射至地址i的关键字全体。
当且仅当∑-=-⋂1 01|)(|miSih=n时达到最小值,意味着将无任何冲突产生。
无冲突的Hash函数称为完备Hash函数(Perfect Hash Function),简称PHF。
事实上,无冲突的要求是极难达到的。
“生日悖论”指出,在23个人中,有两个人的生日在同一天的概率为0.51,即当|S|=n=23,m=365时,发生冲突的概率已经在50%以上。
而当n=50时,发生冲突的概率已达0.97。
在D.Knuth所举的实例中指出,当n=31,m=41时,无冲突的映射函数只占全部可能映射函数的1/107。
因此,在大多数情形下只能追求将冲突尽可能减少。
下面介绍几种常见的Hash函数的构造方法。
2.3.1 直接定址法直接定址法使用关键字的线性函数来计算哈希地址。
也就是说,直接定址法所用的哈希函数为:H(key)=a×key+b (a、b为常数)例如:表2.1是从1岁到100岁人口统计表,其中年龄为关键字。
如果想把这100个记录存放到这些存储单元中,可以定义哈希函数为:若果想把这100个记录存放到这些存储单元中,可以定义Hash 为 H(key)=key-1。
0 1 2 … 98 99表2.1直接定址Hash函数例显然,在直接定址法中,不同关键字的哈希地址也不相同,因此不会出现冲突。
该方法适合于关键字的分布基本连续的情况。
2.3.2 数字分析法1.数字分析法选用关键字中某些取值较分散的数字位来构成哈希地址。
2.对于长度为m的哈希表,每个存储单元都有一个地址码(即下标),其中最大地址码的数字位数称为该哈希表的地址码位数。
例如,对于长度为100的哈希表,其最大地址码99的位数2称为哈希表的地址码位数。
0 1 2 … 98 99在关键字的位数比哈希表的地址码位数大很多时,我们可以对这些关键字进行分析,丢掉一些分布不均匀的位,留下分布均匀的位作为哈希地址。
例如:已知表2.2有80个记录,每个记录的关键字是8位数。
假设哈希表的长度为100,其地址码位数是2位,可以选择两个分布均匀的位构成每个记录的哈希地址。
0 1 … 98 99表2.2 Hash 地址表通过对对这80个关键字进行分析,可知第1、2、3、8位太扎堆了,其余4位的分散性还可以。
因此,取这4位中的任意两位( 比如④、⑥ )作为哈希地址。
总之,数字分析法适合于事先知道可能的关键字,关键字较长且某些位分布较均匀的情况。
而这种根据数据分析法构造的Hash 函数也可能发生冲突。
2.3.3 平方取中法平方取中法是取关键字平方的中间几位作为哈希地址,具体几位取决于哈希表的地址码位数。
理论依据是:一个数的平方的中间几位与这个数的每一位都相关 。
因此,平方取中法所得到的哈希地址与关键字的每一位相关,使得哈希地址具有较好的分散性。
例如:已知表2.3中的关键字(八进制)如下,假设哈希表的长度为512。
由于512=(1000)8,该哈希表的地址码长度为3,因此,可取中间3位作为每个记录的哈希地址。
表2.3由此可见平方取中法适合于事先不了解关键字的全部情况,或者关键字较短的情况。
下面给出平方取中法的哈希函数://平方取中法Hash函数,结设关键字值32位的整数//Hash函数将返回*key的中间10位int Hash(int key){//计算key的平方key *=key;//去掉第11位key >>=11;//返回第10位(即key*key的中间10位)return key %1024}2.3.4 折叠法折叠法是按照哈希表的地址码位数,将关键字分割成位数相同的几段(最后一段可能少些),然后将这几部分相加,得到的和即为哈希地址。
例如:假设哈希表的地址码位数为3,关键字key为:72320324111220。
按照地址码位数,将关键字每3位分段,得到:723 203 241 112 20。
然后,将他们叠加。
则可得,H(key)=299。
所以折叠法适合于关键字较长,地址码位数较小,同时关键字中每位的取值又较扎堆的情况。
2.3.5 除留余数法除留余数法的哈希函数定义为:H(key)=key MOD p(p ≤m ),其中,m为哈希表的长度,p是小于等于m的正整数。
例如,对2.4中的关键字,如果取p=29表2.4如果取p=21,就会出现许多同义词,如表2.5表2.5经验表明,p应选择为略小于m的素数,或者选择无小于20的素因子的合数。
2.3.6 随机乘数法随即乘数法,也称为“乘余取整法”。
随机乘数法使用一个随机实数f,0≦f≦1,乘积f*k的分数部分在0~1之间,用这个分数部分的值与n(Hash表的长度)相乘,乘积的整数部分就是对应的Hash值,显然这个Hash值落在0~n-1之间。
其表达公式为:Hash(k)=「n*(f*k%1)」其中“f*k%1”表示f*k的小数部分,即f*k%1=f*k-「f*k」。
例如,对下列关键字值集合采用随机乘数法计算Hash值,随机数f=0.1031149002,Hash表长度n=100,可得表2.6表2.6此方法的优点是对n的选择不很关键。
通常若地址空间为p位就是选n=2p.Knuth 对常数f的取法做了仔细的研究,他认为f取任何值都可以,但某些值效果更好。
如f=(5-1)/2=0.6180329...比较理想。
3. 处理冲突的方法虽然在构造哈希函数时,我们想了多种办法来尽量防止冲突的发生,但是,在许多情况下冲突依然会出现。
所谓处理冲突,就是要为记录Ri找到另一个空闲的哈希地址。
在探测过程中,可能得到的新哈希地址H1仍然冲突,则再求下一个新哈希地址H2,…,直到得到的新哈希地址Hk确实为一个空闲的哈希地址,这时把记录Ri存入,本次冲突处理完毕。
3.1 链地址法链地址法的主要思想是将关键字为同义词的记录存放在同一个单链表中。