python游走代码_数据结构与算法

第一部分 算法简单概念

算法概念

复习:递归

时间复杂度

空间复杂度

什么是算法?

算法(Algrithm):一个计算过程,解决问题的方法

复习:递归

递归的两个特点:

(1)、调用自身

(2)、结束条件

简单的几个函数:

deffunc1(x):print(x)

func1(x-1)deffunc2(x):if x>0:print(x)print(x+1)deffunc3(x):if x>0:print(x)

func3(x-1)deffunc4(x):if x>0:

func4(x-1)print(x)

时间复杂度

如下代码:判断其时间复杂度

print("hello World")for i inrange(n):print("hello world")for i inrange(n):for j inrange(n):print("hello world")for i inrange(n):for j inrnage(n):for k inrange(n):print("Hello World")

以上四组代码,那组运行时间最短?

用什么方式来体现代码(算法)运行的快慢?

时间复杂度:用来评估算法运行效率的一个介质。

上述的时间复杂度分别如下:一般肉眼观察,循环了几次,print了几次。

再看以下代码例子:

类比生活中的一些时间例子,估计时间:不是一个确切的数而是个约数

继续推算时间复杂度的其他表示方法?

综上,总结一下时间复杂度

"""时间复杂度是用来估计算法运行时间的一个式子(单位)。

一般来说,时间复杂度高的算法比复杂度低的算法慢。

常见的时间复杂度(按效率排序)

O(1)

不常见的时间复杂度(看看就好)

O(n!) O(2n) O(nn) …

如何一眼判断时间复杂度?

循环减半的过程O(logn)

几次循环就是n的几次方的复杂度"""

补充:为什么python中的b+树,二叉树查询速度灰快些?

从时间复杂度的角度理解,因为它的时间复杂度仅次于O(1)

数据库添加B-树索引,查询就快。那么为啥添加索引就快?

B-树索引的内部结构如下:

理解下图就明白了

B-树索引有两种类型的块: 用于查找的分支块(Branch Blocks)和用于存储值的叶块(Leaf Blocks)。

B-树索引的上层分支块包含指向下层索引块的索引数据。从结构上来说就像树一样,分支块就是树干树枝,而叶子就是叶块。

但是和树有区别的是B-树索引是平衡的,所有叶块都自动处于相同的深度。

因此,在索引中从任意位置检索任意记录需要的时间基本上是相同的。可以理解为,如果走索引从中查询一条数据,那么我查找1W条数据和查询100w条数据的速度是一样的。

最底层的叶块包含每个被索引的数据值,和一个相应的用来定位实际行的rowid。根据分支块,找到被索引的数据值,再找到对应的rowid,再从rowid取出对应的数据,就起到了快速查找数据的目的。

空间复杂度

空间复杂度:用来评估算法内存占用大小的一个式子。

“空间换时间”,更多的是涉及硬件性能有关,如内存,硬盘,cpu等。

常见的算法

排序算法是《数据结构与算法》中最基本的算法之一。

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:

#1.0 十大经典排序算法#1.1 冒泡排序#1.2 选择排序#1.3 插入排序#1.4 希尔排序#1.5 归并排序#1.6 快速排序#1.7 堆排序#1.8 计数排序#1.9 桶排序#1.10 基数排序

关于时间复杂度

平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。

线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;

O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序

线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。

关于稳定性

稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。

名词解释:

n:数据规模

k:"桶"的个数

In-place:占用常数内存,不占用额外内存

Out-place:占用额外内存

稳定性:排序后2 个相等键值的顺序和排序之前它们的顺序相同

1、列表查找

列表查找:从列表中查找指定元素

输入:列表、待查找元素

输出:元素下标或未查找到元素

顺序查找

从列表第一个元素开始,顺序进行搜索,直到找到为止。

二分查找

从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

列表查找

递归版的二分法查找

2、冒泡排序思路

首先,列表每两个相邻的数,如果前边的比后边的大,那么交换这两个数……

会发生什么?

1. 算法步骤

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2. 动图演示

python代码实现

#### 冒泡排序 (************************)### 时间复杂度:O(n^2)

defBubble_sort(li):for i in range(len(li)-1): # 第一趟是循环遍历for j in range(len(li)-1-i): # 内层循环是两两之间进行比较,取出较大的数if li[j] > li[j+1]:

li[j], li[j+1] = li[j+1], li[j]

li=[1,2,3,5,8,4,9,10,12]

Bubble_sort(li)

print(li)

3、选择排序思路

一趟遍历记录最小的数,放到第一个位置;

再一趟遍历记录剩余列表中最小的数,继续放置;

……

问题是:怎么选出最小的数?

代码关键点:

无序区

最小数的位置

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。

唯一的好处可能就是不占用额外的内存空间了吧。

1. 算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

2. 动图演示

代码实现:

#### 选择排序#### 时间复杂度:O(n^2)

defselect_sort(li):for i inrange(len(li)):

minLoc= i ###i = 0

for j in range(i+1, len(li)):if li[j]

li[j], li[minLoc]= li[minLoc], li[j],10li=[2,5,4,6,8,9,14,7]

select_sort(li)print(li)

4、插入排序思路

列表被分为有序区和无序区两个部分。最初有序区只有一个元素。

每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。

插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

1. 算法步骤

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

2. 动图演示

代码实现:

##### 插入排序#### 时间复杂度: O(n^2)

definsert_sort(li):for i in range(1, len(li)):

tmp=li[i]

j= i - 1

while j >=0 and li[j] >tmp:

li[j+1] =li[j]

j= j - 1li[j+1] =tmpli= [1,2,5,7,12,23,15,56,21,45]

insert_sort(li)print(li)

5、 快速排序思路

快速排序:快

好写的排序算法里最快的

快的排序算法里最好写的

1. 算法步骤

1、从数列中挑出一个元素,称为 "基准"(pivot);2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

2. 动图演示

代码实现

defpartition(li, left, right):

tmp=li[left]while left =tmp:

right= right - 1li[left]=li[right]while left < right and li[left] <=tmp:

left= left + 1li[right]=li[left]

li[left]=tmpreturnleft#### 快速排序#### 时间复杂度:O(nlogn)

defquick_sort(li, left, right):if left

mid=partition(li, left, right)

quick_sort(li, left, mid-1)

quick_sort(li, mid+1, right)

6、计数排序

算法的步骤如下:

(1)找出待排序的数组中最大和最小的元素

(2)统计数组中每个值为i的元素出现的次数,存入数组C的第i项

(3)对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)

(4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

2. 动图演示

代码的实现:

#创建一个列表,用来统计每个数出现的次数

#现在有一个列表,列表中的数范围都在0到100之间,#列表长度大约为100万。设计算法在O(n)时间复杂度内将列表进行排序。

defcount_sort(li,max_num):

count= [0 for i in range(max_num+1)]for num inli:

count[num]+= 1i=0for num,m inenumerate(count):for j inrange(m):

li[i]=num

i+= 1li= [1,2,5,2,0,1,11,54,212,154,1,24,12,5,6,5,2,8,9,20,12,23,45,16]

count_sort(li,1000)print(li)

线性结构

把所有的节点用一根线串起来

数组和链表的区别

数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。 而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题。

离散存储(链表)

推荐的学习书籍

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值