篇一 :五种查找算法总结

一、顺序查找 条件:无序或有序队列。

原理:按顺序比较每个元素,直到找到关键字为止。

时间复杂度:O(n)

二、二分查找(折半查找) 条件:有序数组

原理:查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束; 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

如果在某一步骤数组为空,则代表找不到。

这种搜索算法每一次比较都使搜索范围缩小一半。

时间复杂度:O(logn)

三、二叉排序树查找 条件:先创建二叉排序树:

1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

3. 它的左、右子树也分别为二叉排序树。

原理:

在二叉查找树b中查找x的过程为:

1. 若b是空树,则搜索失败,否则:

2. 若x等于b的根节点的数据域之值,则查找成功;否则:

3. 若x小于b的根节点的数据域之值,则搜索左子树;否则:

4. 查找右子树。

时间复杂度:

四、哈希表法(散列表) 条件:先创建哈希表(散列表)

原理:根据键值方式(Key value)进行查找,通过散列函数,定位数据元素。

时间复杂度:几乎是O(1),取决于产生冲突的多少。

五、分块查找 原理:将n个数据元素"按块有序"划分为m块(m ≤ n)。

每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;

而第2块中任一元素又都必须小于第3块中的任一元素,……。

然后使用二分查找及顺序查找。

…… …… 余下全文

篇二 :常用查找算法

常用查找算法

常用查找算法

摘要

请用一段简单的话描述该词条,马上添加摘要。

查找算法-概念

查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。用关键字标识一个数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素。在计算机中进行查找的方法是根据表中的记录的组织结构确定的。

顺序查找也称为线形查找,从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。

二分查找要求线形表中的结点按关键字值升序或降序排列,用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

分块查找也称为索引查找,把线形分成若干块,在每一块中的数据元素的存储顺序是任意的,但要求块与块之间须按关键字值的大小有序排列,还要建立一个按关键字值递增顺序排列的索引表,索引表中的一项对应线形表中的一块,索引项包括两个内容:① 键域存放相应块的最大关键字;② 链域存放指向本块第一个结点的指针。分块查找分两步进行,先确定待查找的结点属于哪一块,然后在块内查找结点。

哈希表查找是通过对记录的关键字值进行运算,直接求出结点的地址,是关键字到地址的直接转换方法,不用反复比较。假设f包含n个结点,Ri为其中某个结点(1≤i≤n),keyi是

其关键字值,在keyi与Ri的地址之间建立某种函数关系,可以通过这个函数把关键字值转换成相应结点的地址,有:addr(Ri)=H(keyi),addr(Ri)为哈希函数。

查找算法-顺序查找

顺序查找过程:从表中的最后一个记录开始,逐个进行记录的关键字与给定值进行比较,若某个记录的关键字与给定值相等,则查找成功,找到所查的记录;反之,若直到第一个记录,其关键字和给定值比较都不相等,则表明表中没有所查的记录,查找失败。

…… …… 余下全文

篇三 :C语言常用算法总结(20xx.12)

C语言常用算法归纳

编程题考查学生对一种C语言常用算法的设计能力,以下对二级C语言考试中常用算法进行分类解析。

1.计数、求和、求阶乘等算法。

这类问题使用循环实现,需注意根据问题确定循环变量的初值、终值及结束条件,以及用于表示计数、和、阶乘的变量的初值。

程序段一:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3, 4, 5, 6, 7, 8, 9, 0的数的个数并打印出来。

本题使用数组来处理,用数组a[100]存放产生的100个随机整数,数组x[11]存放个位上的数字分别为1,2,3,4, 5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中??个位是0的个数存放在x[10]中。

#include<stdio.h>

void main()

{int a[101],x[11],i,p;

for(i=0;i<11;i++)

x[i]= 0;

for(i=1;i<=100;i++)

{a[i]=rand()%100;

printf("%4d",a[i]);

if(i%10==0)printf("\n");

for(i=1;i<=100;i++)

{p=a[i]%10;

if(p==0)p=10;

x[p]=x[p]+1;

for(i=l;i<=10;i++)

{p=i;

if(i==10)p=0;

printf("%d,%d\n",p,x[i]);

printf("\n");

2.求两个整数的最大公约数、最小公倍数算法。

求最大公约数的算法思想:

(1)对于已知两数m, n,使得m>n;

(2)除以n得余数r;

…… …… 余下全文

篇四 :常用推荐系统算法总结及性能比较

一,常用推荐系统算法总结

1、Itemcf(基于商品的协同过滤)

这个算法是cf中的一种,也是当今很多大型网站都在采用的核心算法之一。对于商城网站(以Amazon为代表,当然也包括京东那种具有搞笑特色的推荐系统在内),影视类推荐,图书类推荐,音乐类推荐系统来说,item的增长速度远不如user的增长速度,而且item之间的相似性远不如user之间的相似性那么敏感,所以可以在离线系统中将item的相似度矩阵计算好,以供线上可以近乎即时地进行推荐。因为这种方法靠的是item之间的相关性进行推荐,所以推荐的item一般都和喜欢的item内容或者特性高度相似,很难推荐出用户潜在喜欢的item,多样性也比较差。

2、Usercf(基于用户的协同过滤)

这个是cf中的另外一种,它的主要特色是可以发现和用户具有同样taste的人,有句俗话叫做观其友知其人,大概也是这个道理吧。找到用户的相似用户,通过相似用户喜欢的item推荐给该用户。因为用户的相似用户群还是比较敏感的,所以要频繁地计算出用户的相似用户矩阵,这样的话运算量会非常大。而且这个算法往往推荐出来的item很多都是大家都喜欢的比较hot的item,有的时候它提供的结果并不是个性化,反而成了大众化的推荐了。用这种算法的web应用一般都是item更新频繁,比如提供资讯类服务的应用(以“指阅”为代表的),或者笑话类推荐(以“冷笑话精选”为代表的)。当然这种算法的一个中间产物-----用户相似度矩阵是一个很有用的东西,社交类的网站可以利用这个中间产物来为用户提供相同品位的好友推荐。

3、Content_based(基于内容的推荐)

基于内容的推荐,很大程度上是在进行文本挖掘。web应用提供的内容或者爬取的内容在推给用户之前可以做一些挖掘,比如资讯类的应用,将抓取到的资讯,通过文本分析那一套算法提取出每篇资讯的关键词,以及统计频次和逆向文档频率来聚类或者笨一点地话计算出资讯的相似度矩阵,即共同的key words越多,两篇资讯的相似度越高。当你的用户很少很少,你的显式反馈数据非常非常少的时候,你可以根据用户的浏览或者搜索等等各种行为,来给用户进行推荐。再猥琐一点的话,你可以在用户刚刚注册好你的应用的时候,给他一些提问,比如让他输入一些感兴趣的话题啊,或者对以前看过的电影打分什么的。(当然这些电影都是你从各个簇中随机选取的,要足够多样性)这个算法它好就好在,不需要拿到用户--项目的评分矩阵,只需要知道用户喜欢什么,就可以很快速地推荐给用户十分相关的item。这个算法需要每天都要根据你抓取的资讯,不断地计算item之间的相似性。这个算法有个好处在于可以从容应对上面的两个算法其实都很难应对的问题,就是如果你想推出一个新的item,因为没有一个人有对这个new item的评分,所以上述的两个算法不可能推荐新的东西给你,但你可以用基于内容的算法将新的item计算出它属于哪个类,然后时不时地推出你的新item,这点对于商城尤其重要。

…… …… 余下全文

篇五 :常用算法总结

常用算法总结(一) 一、变量值的交换

算法思想:若交换两个变量的值,必须引入第三个新的变量进行传递。

以下代码是错误的:

X=12 :Y=34 :X=Y :Y=X 正确的代码是:

X=12 :Y=23 :T=X :X=Y :Y=T 二、判断一个数是否能被另一个数整除

Print n,s,s/n

四、对数组中的元素逐一进行操作

算法思想:在VB中,对于数组中元素的操作,往往使用到For循环。通用代码为:

Dim 数组名([下标下界] To 下标上界) ??

For i=LBound(数组名) To UBound(数组名) ??

数组名 ( i ) ??

算法思想:可以用整除的定义(余数为0)或X除以Y …… 等于X整除Y等表达式进行判断。 Next i

条件表达式可以为:X mod Y=0 或 X\ Y=X/Y 通过以上循环,可以对数组中所有元素逐一操作。 或 Int(X/Y)=X/Y

如果以上条件表达式为True,则表示X能被Y整除。 三、累加、阶乘、计数和求平均值 算法思想:使用循环语句,并用一个变量存放累加的中间及最终结果。 注:

累加求和时变量初值为0,计算阶乘时变量初值为1。 统计计个数(计数)时可用一个变量作为统计个数的累加变量,每次加1即可。

求平均值算法思想是先求和,再除以个数。 条件求和(或计数):在循环语句中加入If-End If判断语句。

例题:计算1到10之间所有整数的累加和以及10!。 n=10

sum=0 ‘累加求和时,变量的初值一定为0

prod=1 ‘累乘(连乘)时,变量的初值一定为1 For i=1 To n sum=sum+i prod=prod*i

…… …… 余下全文

篇六 :笔试题目总结之四——常用数据结构与算法

数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易。在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结构和算法都问一遍不太现实。所以,实际的情况是,企业一般考察一些看起来很基本的概念和算法,或者是一些变形,然后让你去实现。也许看起来简单,但是如果真让你在纸上或者是计算机上快速地完成一个算法,并且设计测试案例,最后跑起来,你就会发现会很难了。这就要求我们要熟悉,并牢固掌握常用的算法,特别是那些看起来貌似简单的算法,正是这些用起来很普遍的算法,才要求我们能很扎实的掌握,在实际工作中提高工作效率。遇到复杂的算法,通过分析和扎实的基本功,应该可以很快地进行开发。

闲话少说,下面进入正题。

一.数据结构部分

1.数组和链表的区别。(很简单,但是很常考,记得要回答全面)

C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。

链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。

从逻辑结构来看:数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况,即数组的大小一旦定义就不能改变。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)。

从内存存储来看:(静态)数组从栈中分配空间(用NEW创建的在堆中), 对于程序员方便快速,但是自由度小;链表从堆中分配空间, 自由度大但是申请管理比较麻烦.

…… …… 余下全文

篇七 :c语言常用算法总结

C语言常用算法模块的总结

一、最大值,最小值问题 教材page13/1.6、page36/2.4(2)、(3)、page98例5.1、5.2

二、连乘连加问题 page113、114、115 page129/6.3 page129/6.4、6.5

三、闰年算法 page17、 page107

四、连续小数相加减 page18、 page124

五、素数、整除问题 page18、 page124、 page126、 page127

六、大小写字母转换、密码问题 page51、 page87、 page89/4.9、 page104、 page67、 page128

七、格式化字符提醒 起于page 76

八、三角形面积问题 page86

九、一元二次方程 page87、 page89/4.8、 page108

十、分段一元函数 page100、 page110、 page111/5.5、5.6

十一、位运算 page112/5.7、 page129/6.2、6.3

十二、公约数公倍数 page129/6.1

十三、迭代法、二分法 page129-130/6.11-13

C语言常用算法模块的总结

一、最大值,最小值问题

教材page13/1.6、page36/2.4(2)、(3)、page98例5.1、5.2

主要思想:替换+中转 关联习语: if句

int a,b,c,max; 多余的一个max是承载中转的容器 scanf(“%d,%d,%d”,&a,&b,&c);

max=a; 定初值

if(max<b)

Max=b; 分别取a、 b、c相互比较,由于只需输 if(max<c) 出最大或者最小值,所以只需将最大值存 Max=c; 储在max中即可

…… …… 余下全文

篇八 :VB_常用算法总结

一、变量值的交换

算法思想:若交换两个变量的值,必须引入第三个新的变量进行传递。

以下代码是错误的:

X=12 :Y=34 :X=Y :Y=X

正确的代码是:

X=12 :Y=23 :T=X :X=Y :Y=T

二、判断一个数是否能被另一个数整除

算法思想:可以用整除的定义(余数为0)或X除以Y等于X整除Y等表达式进行判断。 条件表达式可以为:X mod Y=0 或 X\ Y=X/Y 或 Int(X/Y)=X/Y 如果以上条件表达式为True,则表示X能被Y整除。

三、累加、阶乘、计数和求平均值

算法思想:使用循环语句,并用一个变量存放累加的中间及最终结果。

注: 累加求和时变量初值为0,计算阶乘时变量初值为1。

统计计个数(计数)时可用一个变量作为统计个数的累加变量,每次加1即可。 求平均值算法思想是先求和,再除以个数。

条件求和(或计数):在循环语句中加入If-End If判断语句。

例题:计算1到10之间所有整数的累加和以及10!。

n=10

sum=0 ‘累加求和时,变量的初值一定为0

prod=1 ‘累乘(连乘)时,变量的初值一定为1

For i=1 To n

sum=sum+i

prod=prod*i

Next i

Print sum,prod

例题:统计0—100之间能被3整除的数的个数、累加和及其平均值。

s=0

n=0

For i=0 To 100

If i mod 3 =0 Then

s=s+i

n=n+1

End If

Next i

Print n,s,s/n

四、对数组中的元素逐一进行操作

算法思想:在VB中,对于数组中元素的操作,往往使用到For循环。通用代码为: Dim 数组名([下标下界] To 下标上界)

…… …… 余下全文