数据的运算

目录

一、时间复杂度

1、O(1)-常量

2、O(n)-线性

3、O(n^2)-次方

4、O(log(n))-对数

二、查找算法

1、顺序查找

2、二分查找

3、哈希查找

三、排序算法

1、插入排序

2、冒泡排序

3、选择排序

4、希尔排序

5、快速排序

6、堆排序

7、归并排序

8、算法时间复杂度总结


应试为主,主要记录相关思想

一、时间复杂度

算法的时间复杂度大概可分为四种形式,O(1)-常量,O(n)-线性,O(n^2)-次方,O(log2(n))-对数

1、O(1)-常量

// 数据交换
Temp=i ;
i=j;
j=temp;

以上三条单个语句的频度均为1,是一个常数阶,记作T(n)=O(1)。此算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。

2、O(n)-线性

int sum = 0; 
for(int i = 0; i<=n; ++i) { 
    sum += i; 
}

一共算了n次加法(耗时部分主要在循环体),那么就说这个时间复杂度是O(n)。比如,某个计算共计算了2n + 1次,那么这个时间复杂度也是O(n)。

3、O(n^2)-次方

// 双重循环
int sum = 0; 
for(int i = 0; i<=n; ++i) { 
    for(int j = 0; j <=n; ++j) { 
        sum += (i + j); 
    } 
}

双重循环的时间复杂度成O(n^2)的次数增长。

4、O(log(n))-对数

二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:

  • 一次二分剩下:n/2
  • 两次二分剩下:n/2/2 = n/4
  • m次二分剩下:n/(2^m)

在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为

n/(2^m)=1; ——>  2^m=n;

所以时间复杂度为:log2(n)

对数时间复杂度的算法,每次运行时都能排除掉部分的刷选情况,比如二分法,每次都排除一半的可能。

二、查找算法

1、顺序查找

将待查的元素从头到尾与表中元素进行比较,如果存在,则返回成功;否则,查找失败。此方法效率不高

平均查找长度: (n+1)/2(设置监视哨)

2、二分查找

二分查找的前提是元素有序(一般是升序),基本思想是拿中间元素。

A[m]与要查找的元素x进行比较,如果相等,则已经找到,如果A[m]比x大,那么要找的元素一定在A[m]前边(左边),如果A[m]比x小,那么要找的元素一定在A[m]后边(右边)。

每进行一次查找,数组规模减半。反复将子数组规模减半,直到发现要查找的元素,或者当前子数组为空。

注意:已参与比较的元素不再参与比较

3、哈希查找

哈希表hashtable通过一个已记录的关键字为自变量的函数(哈希函数)得到该记录的存储地址,所以在哈希表中进行查找操作时,需用同一哈希函数计算得到待查记录的存储地址,然后到相应的存储单元去获得有关信息再判定查找是否成功。

冲突的解决方法:随机探测再散列线性探测

上例使用的解决冲突的方法——>线性探测:当两个数的HASH值冲突时,比如34MOD11 和 12MOD11 都为1,那么12这个数就需要从2的位置开始往后找,找到第一个空余的位置,然后存下来,当然如果后边没有多余的位置,那么再从头继续遍历前边的位置。

典型真题

试题分析

根据题干求出每个关键码序列的散列值:

Hash(23)= 23% 11=1,Hash(40)= 40% 11=7,Hash(91)= 91% 11=3,

Hash(17)= 17% 11=6,Hash(19)= 19% 11=8,Hash(10)= 10% 11=10,

Hash(31)= 31% 11=9,Hash(65)= 65% 11=10,Hash(26)= 26% 11=4,

参考答案:B

三、排序算法

1、插入排序

插入排序(Insert Sort)

顾名思义,插入排序是通过不断插入待排序的元素完成整个排序过程。插入排序是一种很简单的排序方式,基本思想就是将一个元素插入到已经排序好的序列中,从而形成一个新的有序序列。它重复地选择未排序的元素,将其插入已经排序好的序列中,直到没有待排序元素时,整个排序过程完成。

插入排序的工作方式就像大家打扑克牌时抓牌一样。开始时,我们手上是没有牌的,依次从桌面上面抓取扑克牌,然后插入自己手中已有扑克牌的位置中,只是插入的时候我们按照一定的顺序将它插入到合适的位置中。

最好情况的时间复杂度:O(n)

最差情况的时间复杂度:O(n2)

2、冒泡排序

冒泡排序(Bubble Sort)

重复地遍历要排序的序列,会依次比较两个相邻的元素,如果发现两个相邻的元素顺序错误就把它们交换过来。遍历序列的工作会重复地进行直到没有相邻的元素需要交换位置,也就是说序列的排序工作已经完成。

冒泡排序的算法名称的由来就是因为在排序的过程中,按照排序规则(升序或者降序),越小或者越大的元素会经过交换之后慢慢 “浮” 到序列的顶端,就如同水中的气泡一样最终会浮到顶端一样,所以起名为 “冒泡排序”。

3、选择排序

选择排序(Select Sort)

假设我们按照从小到大的顺序进行排序。选择排序会首先从待排序序列中选择一个最小的元素放入排序好的序列中,然后依次在从未排序好的序列中选择最小的元素,直到最后需要选择的待排序序列中只有一个元素,只需要将这个元素放在最后位置,就完成了整个排序过程。

选择排序的算法名称的由来就是因为在排序的过程中,按照排序规则(升序或者降序),依次从待排序的序列中选择出需要排列的元素。越小或者越大的元素会先选择出来,直至完成整个排序。

4、希尔排序

希尔排序是插入排序的一种,有时候也被称为 “缩小增量排序”。它是插入排序的改进版,与插入排序的不同之处在于,希尔排序会优先比较距离较远的元素

第一次分组,间隔通常为总长度的一半(向上或者向下取整),奇偶均可。每组分别进行排序

第二次分组,间隔为第一次间隔的一半,重新进行排序,依次进行,直到排序完成。

希尔排序在数据规模较大的时候,交换次数和时间复杂度要比插入排序更加优秀。

  • 最好的情况下,只要进行比较,不需要进行交换,时间复杂度时O(n)
  • 最坏的情况下,既要进行比较,又要进行交换,时间复杂度为O(n^2)/   ( O(n^1.3)——考试书本)

5、快速排序

快速排序(Quick Sort),是计算机科学与技术领域中非常经典的一种排序算法,应用分治思想进行排序

快速排序由于其时间复杂度优于大部分的排序算法,因而命名为快速排序。

快速排序实现的核心思想就是在待排序序列中选择一个基准值,然后将小于基准值的数字放在基准值左边,大于基准值的数字放在基准值右边,然后左右两边递归排序,整个排序过程中最关键部分就是寻找基准值在待排序序列中的索引位置。

6、堆排序

堆排序,分为大顶堆和小顶堆

小顶堆:根部元素比孩子节点都要小

大顶堆:根部元素比孩子节点都要大

7、归并排序

(1)分解。将n个元素分层各含n/2个元素的子序列

(2)求解。用归并排序对两个子序列递归地排序

(3)合并。合并两个已经排好序的子序列以得到排序结果。

8、算法时间复杂度总结

稳定性:相同的两个元素在经过多次排序后,元素的位置始终保持不变。

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

典型真题一

对于n个元素的关键宇序列{k1,k2, ...kn},当且仅当满足关系 ki≤k2i且ki≤k2i+1{i=1.2...[n/2]} 时称其为小根堆(小顶堆)。以下序列中,( )不是小根堆。

A.16,25,40,55,30,50,45

B.16,40,25,50,45,30,55

C.16,25,39.,41,45,43,50

D.16,40,25,53,39,55,45

试题分析

按照条件“ki≤k2i且ki≤k2i+1”要求,带入四个选项。以选项A为例,当i=1时,K1(16)<K2(25),且K1(16)<K3(40)...

依次类推,可得选项D不满足要求。

试题答案:D

典型真题二

在55个互异元素构成的有序表A[1..55]中进行折半查找(或二分查找,向下取整)。若需查找的元素等于A[19],则在查找过程中参与比较的元素依次为()、A[19]。

A A[28]、A[30]、A[15]、A[20]

B A[28]、A[14]、A[21]、A[17]

C A[28]、A[15]、A[22]、A[18]

D A[28]、A[18]、A[22]、A[20]

试题分析

对55个元素构成的有序表进行折半查找时,可用判定树描述查找过程,由于A[19]小于中间元素A[28],所以判定树的左分支如下所示。

  • 第一次比较元素:[55+1]/2 = 28,19比28小,所以范围缩减为1-27(已经比较过的元素不再比较,28排除
  • 第二次比较元素:[1+27]/2 = 14,19比14大,所以范围缩减为15-27
  • 第三次比较元素:[15+27]/2 = 21,19比21小,所以范围缩减为15-20
  • 第四次比较元素:[15+20]/2 = 17.5,向下取整为17,19比17大,所以范围缩减为18-20;
  • 第五次比较元素:[18+20]/2 = 19,成功找到对应的元素

从中可知,查找过程中参与比较的元素分别为A[28]、A[14]、A[21]、A[17]、A[19]。

参考答案:B

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值