源代码--数据结构与算法(Python版)chap9 查找

合集下载

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)数据结构与算法是计算机科学中非常重要的基础知识,它们在软件开辟中起着至关重要的作用。

在Python编程语言中,数据结构与算法同样扮演着重要的角色。

本文将介绍数据结构与算法在Python中的应用,匡助读者更好地理解和运用这些知识。

一、数据结构1.1 列表(List)Python中最常用的数据结构之一是列表,它可以存储任意类型的数据,并且支持增删改查等操作。

1.2 字典(Dictionary)字典是另一个常用的数据结构,它以键值对的形式存储数据,可以快速查找和修改数据。

1.3 集合(Set)集合是一种无序且不重复的数据结构,可以进行交集、并集、差集等操作,非常适合处理数学运算。

二、算法2.1 排序算法Python中有多种排序算法可供选择,如冒泡排序、快速排序、归并排序等,每种算法都有其适合的场景和特点。

2.2 查找算法查找算法用于在数据集中查找指定的元素,常见的查找算法有线性查找、二分查找等,可以提高查找效率。

2.3 图算法图算法是一类特殊的算法,用于解决图结构中的问题,如最短路径、最小生成树等,在网络分析和路由规划中有广泛应用。

三、应用实例3.1 数据处理数据结构与算法在数据处理中有着重要的应用,可以匡助我们高效地处理大量数据,如数据清洗、分析和建模等。

3.2 网络编程在网络编程中,我们时常需要使用数据结构与算法来处理网络数据包、路由信息等,确保网络通信的稳定和高效。

3.3 人工智能在人工智能领域,数据结构与算法也扮演着重要的角色,如机器学习算法中的数据预处理、特征选择等。

四、优化技巧4.1 空间复杂度优化在编写代码时,我们应该尽量减少空间复杂度,避免不必要的内存占用,提高程序的运行效率。

4.2 时间复杂度优化算法的时间复杂度直接影响程序的运行速度,我们可以通过选择合适的算法和数据结构来优化时间复杂度。

4.3 算法优化技巧除了选择合适的数据结构和算法外,我们还可以通过优化代码逻辑、减少循环嵌套等方式来提高程序的性能。

Python的数据结构和算法

Python的数据结构和算法

Python的数据结构和算法Python是一种功能强大的编程语言,具有广泛的应用领域。

在Python中,数据结构和算法是非常重要的概念,它们对于编写高效、可靠的程序至关重要。

本文将介绍Python的一些常见数据结构和算法,并探讨它们的应用场景和实现方法。

一、列表(List)列表是Python中最常用的数据结构之一,它允许我们存储和操作多个值。

列表可以容纳任意类型的元素,并且可以根据需要动态调整大小。

使用列表,我们可以实现许多常见的算法和数据操作。

例如,我们可以使用列表来存储学生的成绩,并计算它们的平均值。

通过使用列表的索引,我们可以访问列表中的特定元素,并对它们进行操作。

二、字典(Dictionary)字典是Python中另一个常见的数据结构,它允许我们使用键-值对的形式存储和访问数据。

字典提供了一种非常高效的查找方式,可以根据键快速找到对应的值。

字典的应用场景非常广泛,比如存储学生的学号和姓名,或者存储产品的价格和库存信息等。

通过使用字典,我们可以快速查找和更新数据,提高程序的效率和可读性。

三、堆栈(Stack)堆栈是一种特殊的数据结构,它采用“后进先出”(LIFO)的原则来管理数据。

堆栈允许我们在一端插入和删除元素,这一端被称为栈顶。

在Python中,我们可以使用列表来模拟堆栈的行为。

通过使用列表的append()方法可以将元素压入堆栈,使用pop()方法可以将元素从堆栈中弹出。

堆栈的应用广泛,比如在计算机程序中实现函数的调用和返回过程,或者在迷宫游戏中实现角色移动等。

四、队列(Queue)队列是另一种重要的数据结构,它采用“先进先出”(FIFO)的原则来管理数据。

队列允许我们在一端插入元素,在另一端删除元素。

Python中的队列可以用列表来实现,使用append()方法在队列的末尾插入元素,使用pop(0)方法在队列的开头删除元素。

队列在很多场景下都有应用,比如任务调度、消息传递等。

它可以帮助我们实现有效的数据处理和资源管理。

数据结构与算法-查找

数据结构与算法-查找

数据结构与算法-查找数据结构与算法查找在计算机科学的世界里,数据结构和算法就像是建筑师手中的蓝图和工具,帮助我们有效地组织和处理数据。

而查找,作为其中的一个重要环节,在各种程序和应用中都有着广泛的应用。

当我们面对大量的数据时,如何快速准确地找到我们需要的信息,就成了一个关键的问题。

查找算法就是为了解决这个问题而诞生的。

让我们先从最简单的顺序查找说起。

想象一下,你有一个长长的名单,上面写满了名字,而你要找到其中一个特定的名字。

你会怎么做?最直接的方法就是从名单的开头一个一个地看下去,直到找到为止。

这就是顺序查找的基本思路。

顺序查找不需要对数据进行任何预处理,实现起来非常简单。

但它的效率并不高,特别是当数据量很大时,可能需要检查很多个元素才能找到目标。

不过,在某些情况下,顺序查找还是很有用的。

比如,数据是无序的,而且查找的频率不高,或者数据量比较小的时候。

接下来,我们来看看二分查找。

二分查找就像是在猜数字游戏中,通过不断缩小范围来快速猜出答案。

假设我们有一个已经排好序的数列,要查找一个特定的数字。

我们先比较目标数字和中间的数字,如果目标数字比中间数字大,那就只在中间数字的右边继续查找;如果目标数字比中间数字小,就在左边查找。

通过不断地将查找范围缩小一半,我们能够快速地找到目标数字。

二分查找的效率比顺序查找高很多,尤其是对于大规模的数据。

但它有一个前提,那就是数据必须是有序的。

除了这两种常见的查找算法,还有一些其他的查找方法,比如哈希查找。

哈希查找就像是给数据分配了一个独特的“房间号码”,通过这个“房间号码”,我们可以直接找到对应的数据,而不需要进行逐个比较。

哈希函数是实现哈希查找的关键。

它将数据映射到一个特定的位置,也就是哈希表中的“槽”。

但有时候会出现哈希冲突,就是不同的数据被映射到了同一个“槽”里。

这时候就需要一些解决冲突的方法,比如链地址法或者开放地址法。

在实际应用中,我们需要根据具体的情况选择合适的查找算法。

数据结构与算法实验源代码

数据结构与算法实验源代码

数据结构与算法实验源代码数据结构与算法实验源代码1.实验目的本实验旨在通过实践,加深对数据结构与算法的理解与应用能力,掌握数据结构和算法的基本概念与原理,并能够运用所学知识解决实际问题。

2.实验材料●一台已安装好编译器的计算机●数据结构与算法实验源代码文件3.实验环境配置在实验开始之前,必须确保计算机上已安装好以下环境:●编译器(可以是C++、Java等)●数据结构与算法实验源代码文件4.实验内容及步骤4.1 实验一:线性表4.1.1 实验目的通过实现线性表的相关操作,加深对线性表及其操作的理解,并能够灵活应用。

4.1.2 实验步骤1.实现线性表的初始化函数2.实现线性表的插入操作3.实现线性表的删除操作4.实现线性表的查找操作5.实现线性表的排序操作6.实现线性表的输出操作7.编写测试代码,对线性表进行测试4.1.3 实验结果与分析进行若干测试用例,验证线性表的正确性,并分析算法的时间复杂度与空间复杂度。

4.2 实验二:栈与队列4.2.1 实验目的通过实现栈与队列的相关操作,加深对栈与队列的理解,并掌握栈与队列的应用场景。

4.2.2 实验步骤1.实现栈的初始化函数2.实现栈的入栈操作3.实现栈的出栈操作4.实现栈的查看栈顶元素操作5.实现队列的初始化函数6.实现队列的入队操作7.实现队列的出队操作8.实现队列的查看队首元素操作4.2.3 实验结果与分析进行若干测试用例,验证栈与队列的正确性,并分析算法的时间复杂度与空间复杂度。

(继续添加实验内容及步骤,具体根据实验项目和教学要求进行详细分析)5.实验附件本文档所涉及的实验源代码文件作为附件随文档提供。

6.法律名词及注释6.1 版权:著作权法所规定的权利,保护作品的完整性和原创性。

6.2 开源:指软件可以被任何人免费使用、分发和修改的一种软件授权模式。

(继续添加法律名词及注释)。

Python中的数据结构和算法详解

Python中的数据结构和算法详解

Python中的数据结构和算法详解Python是一门功能强大的编程语言,在数据科学、机器学习及人工智能等领域广泛应用。

在Python中,数据结构和算法是处理数据的重要部分。

本文将详细介绍Python中的数据结构和算法,包括列表、元组、集合、字典和排序、搜索、递归、贪心算法等基本算法。

一、列表列表是一种最常用的数据结构,Python中的列表可以包含不同类型的元素,可以通过索引和切片访问元素,还可以使用内置函数和方法扩展、删除和排序列表。

下面是一个Python中创建和操作列表的示例代码:```python# 创建列表list1 = [1, 2, 3, 4, 5]list2 = ['a', 'b', 'c', 'd', 'e']# 访问列表中的元素print(list1[0])print(list2[2])print(list1[1:4])# 扩展列表list1.append(6)list2.insert(0, 'f')print(list1)print(list2)# 删除列表中的元素list1.remove(3)del list2[2]print(list1)print(list2)# 排序列表list3 = [4, 2, 1, 5, 3]list3.sort()print(list3)```二、元组元组是Python中的另一种数据结构,类似于列表,但是元组是不可修改的,一旦创建后就不能修改。

元组可以存储不同类型的数据,可以作为函数的返回值。

下面是一个Python中创建和操作元组的示例代码:# 创建元组tuple1 = (1, 2, 3, 4, 5)tuple2 = ('a', 'b', 'c', 'd', 'e')# 访问元组中的元素print(tuple1[0])print(tuple2[2])print(tuple1[1:4])# 元组作为函数返回值def square_cube(num):return num**2, num**3result = square_cube(3)print(result)```三、集合集合是Python中的一种数学对象,它可以存储不同类型的元素,且每个元素各不相同。

源代码--数据结构与算法(Python版)第9章 查找

源代码--数据结构与算法(Python版)第9章  查找

第9章查找 (2)9.2基于线性表查找 (2)9.2.1 顺序查找 (2)9.2.2 二分查找 (2)9.2.3分块查找 (3)9.3二叉查找树 (4)哈希表 (7)9.6 Python 语言提供的查找算法 (8)9.7 实例 (9)9.7.1 最大值或最小值 (9)9.7.2 二分法查找递归实现 (10)第9章查找9.2基于线性表查找基于线性表的查找方法大致可分为顺序查找、折半查找与分块查找等几种类型。

9.2.1 顺序查找def sequential_search(lis, item):pos=0found = Falsewhile pos < len(lis) and not found:if lis[pos] == item:found = Trueelse:pos = pos+1return(found)if __name__ == '__main__':testlist = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]result = sequential_search(testlist, 5)print(result)result = sequential_search(testlist, 4)print(result)9.2.2 二分查找【二分法查找非递归实现】def binarysearch(a, num):length = len(a)low = 0 # 最小数下标high = length – 1 # 最大数的下标while low <= high:mid = int(low + ((high - low) / 2)) # 取中间值if a[mid] < num:low = mid + 1 # 如果中间值比目标值小,则在mid右半边elif a[mid] > num:high = mid – 1 # 如果中间值比目标值大,则在mid左半边找else:return mid #查找到,位置是mid+1return -1 #没查到if __name__ == '__main__':b = [1, 3, 4, 8, 22, 65, 73, 90]print(b)a = binarysearch(b, 22)print(a)c = binarysearch(b, 21)print(c)9.2.3分块查找【分块查找代码】# 基本原理:# 1.将序列分为m块,块内部无序、外部有序# 2.选取各块最大元素构成索引,对索引进行二分查找,找到所在的块# 3.在确定块中用顺序查找import randomRange = 20Length = 9flag = 0pos = -1tabNum = 3tabPos = -1list = random.sample(range(Range),Length)goal = random.randint(0,Range)print('search ',goal,', in list:')# 子表建立,选择序列前m个元素排序后建立索引,根据索引建立子表list_index = [] #使用二维列表表示多个子序列for i in range(tabNum): #在列表中添加m个列表list_index.append([])#向第1-m子列表添加原序列的前m-1个元素作为索引,留出第一个子列表盛放最大索引for i in range(1,tabNum):list_index[i].append(list[i-1]) #会出现最大值在第二个子列表中,第一子列表为空的情况for i in range(1,tabNum-1): #将添加元素的子列表中的元素降序排列for j in range(1,tabNum-i):if list_index[j]<list_index[j+1]:list_index[j],list_index[j+1] = list_index[j+1],list_index[j]#将其余元素添加到各子列表,比索引大则放到前一个子列表中,其余放入最后一个索引中for i in range(tabNum-1,Length):for j in range(1,tabNum):if list[i]>list_index[j][0]:list_index[j-1].append(list[i])breakelse:list_index[tabNum-1].append(list[i])if len(list_index[0]) > 1: #提取第一个子列表的最大值最为索引for i in range(len(list_index[0])-1,0,-1):if list_index[0][i]>list_index[0][i-1]:list_index[0][i],list_index[0][i-1] = list_index[0][i-1],list_index[0][i] print(list_index) #显示构造的子列表for i in range(tabNum-1,-1,-1): #将给定元素与各子列表进行比较,确定给定元素位置if len(list_index[i]) != 0 and goal<list_index[i][0]:for j in range(len(list_index[i])):if list_index[i][j] == goal:tabPos = i+1pos = j+1flag = 1if flag:print("find in ",tabPos,"list ",pos,"th place")else:print("not found")【程序运行结果】search 13 , in list:[[19, 13, 17, 10, 8, 15, 16], [6], [5]]find in 1 list 2 th placesearch 12 , in list:[[], [16, 8, 11, 15, 13, 7], [2, 1, 0]]not found9.3二叉查找树【二叉排序树实现代码】class BSTNode:def __init__(self, data, left=None, right=None):self.data = data #节点储存的数据self.left = left #节点左子树self.right = right #节点右子树class BinarySortTree:"基于BSTNode类的二叉查找树。

查找和排序算法的python代码

查找和排序算法的python代码

一.查找算法:1.顺序查找:普通程序:def sequefind(l,x):k=0while k<=len(l)-1 and x!=l[k]:k=k+1if k>len(l)-1:return 0else:return ks=[2,6,7,3,9,98]while(1):key=int(input("待查找的数是:"))n=sequefind(s,key)if n==0:print("未找到")else:print(key,"是第",n,"个元素")改进程序:def improveseque(l,x):l[0]=xk=len(l)-1while x!=l[k]:k=k-1return kl=[-1,10,11,90,3,32,5,6,18,15,19,35,9,22,91,88,98]while(1):key=int(input("待查找的数是:"))n=improveseque(l,key)if n==0:print("未找到")else:print(key,"是第",n,"个元素")2.二分查找:def halffind(arr,x):l=0h=len(arr)-1while l<=h:m=(l+h)//2if arr[m]==x:return melse:if x<arr[m]:h=m-1else:l=m+1if l>h:return -1l=[3,5,6,9,10,11,15,18,19,22,32,35,88,90,91,98]while(1):key=int(input("待查找的数是:"))n=halffind(l,key)if n==-1:print("未找到")else:print(key,"是第",n,"个元素")二.排序算法:1.直接插入排序:def insertsort(l,n):for i in range(1,n,1):temp=l[i]j=i-1while j>=0 and temp<l[j]:l[j+1]=l[j]j=j-1l[j+1]=tempreturn ll=[1,4,13,-6,8,9]print(l)n=len(l)print(insertsort(l,n))2.简单选择排序:def selectsort(l,n):for i in range(0,n-1,1):k=ifor j in range(i+1,n,1):if l[j]<l[k]:k=jif k!=i:temp=l[i]l[i]=l[k]l[k]=tempprint(l)l=[1,9,65,23,4,10]print(l)n=len(l)selectsort(l,n)注:在定义函数的最后,print(list)和return list是不同的,不同之处见于最后列表的输出中。

数据结构与算法实验源代码

数据结构与算法实验源代码

数据结构与算法实验源代码数据结构与算法实验源代码一、实验目的本实验旨在通过编写数据结构与算法的实验源代码,加深对数据结构与算法的理解,并提高编程能力。

二、实验环境本实验使用以下环境进行开发和测试:- 操作系统:Windows 10- 开发工具:IDEA(集成开发环境)- 编程语言:Java三、实验内容本实验包括以下章节:3.1 链表在本章节中,我们将实现链表数据结构,并实现基本的链表操作,包括插入节点、删除节点、查找节点等。

3.2 栈和队列在本章节中,我们将实现栈和队列数据结构,并实现栈和队列的基本操作,包括入栈、出栈、入队、出队等。

3.3 树在本章节中,我们将实现二叉树数据结构,并实现二叉树的基本操作,包括遍历树、搜索节点等。

3.4 图在本章节中,我们将实现图数据结构,并实现图的基本操作,包括广度优先搜索、深度优先搜索等。

3.5 排序算法在本章节中,我们将实现各种排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。

3.6 搜索算法在本章节中,我们将实现各种搜索算法,包括线性搜索、二分搜索、广度优先搜索、深度优先搜索等。

四、附件本文档附带实验源代码,包括实现数据结构和算法的Java源文件。

五、法律名词及注释5.1 数据结构(Data Structure):是指数据对象中数据元素之间的关系。

包括线性结构、树形结构、图形结构等。

5.2 算法(Algorithm):是指解决问题的一系列步骤或操作。

算法应满足正确性、可读性、健壮性、高效性等特点。

5.3 链表(Linked List):是一种常见的数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

5.4 栈(Stack):是一种遵循后进先出(LIFO)原则的有序集合,用于存储和获取数据。

5.5 队列(Queue):是一种遵循先进先出(FIFO)原则的有序集合,用于存储和获取数据。

5.6 树(Tree):是由节点组成的层级结构,其中一种节点作为根节点,其他节点按照父子关系连接。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8
折半查找代码
def binarysearch(a, num):
length = len(a)
low = 0 # 最小数下标
high = length – 1
# 最大数的下标
while low <= high: mid = int(low + ((high - low) / 2)) # 取中间值
if a[mid] < num:
5
顺序查找算法容易理解,对表的结构无任 何要求,无论是用顺序存储还是用链表存 储,也无论结点之间是否按关键字排序, 都同样适用。但缺点是效率较低,复杂度 高,时间复杂度为 O(n),折半查找
折半查找的前提是线性表(a0,a1 ,…an-1)已经 按照从小到大的顺序排列。设要查找元素的关键字 为key,首先将查找范围的下限设为low=0,上限 为high=n-1,其中点为m (low high) / 2,中点元 素记为am。用key与中点元素am比较,若key=am, 该元素正为要找的元素,查找停止;否则,若 key>am,则替换下限low=(mid+1),到下半段继续 查找;若key<am,则替换上限high=mid-1,到上 半段继续查找;依此循环,直至找到元素或 low>high为止,low>high时说明此元素未找到。
15 i=7 1 2 5 7 8 11 14 20
(a)查找成功
(b)查找失败
15
i=8(失败) 4
顺序查找代码
def sequential_search(lis, item): pos=0 found = False while pos < len(lis) and not found: if lis[pos] == item: found = True else: pos = pos+1 return(found)
3
【例】如下图,为序列(1, 2, 5, 7, 8, 11, 14, 20)的顺序查
找过程,其中(a)是查找关键字14成功的情况。(b)是未
找到关键字15的情况。
14 查找
01 2345 67 1 2 5 7 8 11 14 20
14 i=0
15 查找
01 2345 67 1 2 5 7 8 11 14 20
30
20
40
10
25 35
48
23
二叉排序树特点:
30
所以,二叉排序树的20形态完全由一4个0 输入序 列决定,一个无1序0 序列可25以通3过5 构造一48棵二
叉排序树而得到一个有23序序列
中序遍历:10,20,23,25,30,35,40,48
1. 中序遍历二叉排序树可得到关键字有序序列。
2. 在构造二叉排序树时,每次插入的新结点都是新 的叶子结点,则进行插入时,不必移动其它结点。
15 i=0
1 2 5 7 8 11 14 20
1 2 5 7 8 11 14 20
14 i=1
15 i=1
1 2 5 7 8 11 14 20
1 2 5 7 8 11 14 20
14 i=2
15 i=2
1 2 5 7 8 11 14 20
1 2 5 7 8 11 14 20
14 i=3
1 2 5 7 8 11 14 20
67 56
30
0
1∧
2
3
4∧
5
6
7
8∧
9
10 ∧ 11 ∧ 12 ∧ 13 ∧
Apr
Dec ∧ Feb ∧
Jan
Mar
Oct
Sep ∧
Aug ∧
Jun May ∧ Nov ∧
采用链地址法处理冲突: Jul ∧
67 14 20
14 low mid high
01 2345 67
15 1 2 5 7 8 11 14 20
查找
15
low mid
high
4567 8 11 14 20
15 low mid high
67 14 20
15 low mid high
7 20
(a)搜索成功
15 low mid high (b)搜索失败
最小数据。为此,构造一个索引表index[l..B],每个
元素index [i](0≤i≤B-1)中存放第i块的最大关键字
key、该块的起始位置start及结束位置end
10
由索引确定记录所在的块,在块内进行查找。 可见,分块查找的过程是一个逐步缩小搜索 空间的过程。
11
二叉查找树
二叉查找树(Binary Search Tree), 又称二叉搜索树或者二叉排序树,具有如下 特性: 1. 若它的左子树不空,则左子树上所有结点 的值均小于根结点的值; 2. 若它的右子树不空,则右子树上所有结点 的值均大于根结点的值; 3. 它的左、右子树也都分别是二叉排序树。
return
bt = bt.left
elif key > entry:
if bt.right is None:
bt.right = BSTNode(key)
return
bt = bt.right
else:
bt.data = key
return
23
{62,88,58,47,35,73,51,99,37,93},构造如图9.7所示的 二叉排序树;如果 {62,88,58,47,35,73,51,99,37,93} 是升序,即{35,37,47,51,58,62,73,88,93,99},构造二 叉排序树如图9.8所示。查找结点99,图9.7只需2次比 较,而图9.8需要比较10次,二者差异很大。
3. 二叉排序树不但拥有类似于折半查找的特性,又 采用了链表作存储结构,因此是动态查找表的一
种适宜表示。
4.二叉排序树的删除算法
和插入相反,删除在查找成功之后进行,并 且要求在删除二叉排序树上某个结点之后,仍 然保持二叉排序树的特性。
可分三种情况讨论:
1. 被删除的结点是叶子; 2. 被删除的结点只有左子树或者只有右子树; 3. 被删除的结点既有左子树,也有右子树。
7
序列(1, 2, 5, 7, 8, 11, 14, 20)的折半查找过程, 其中(a)是查找关键字14的成功的情况,(b)是 未找到关键字15的情况。
01 2345 67
14 1 2 5 7 8 11 14 20
查找 low
14 mid
high
4567 8 11 14 20
14 low mid high
(1)被删除的结点是叶子结点
例如:
被删关键字 = 20 88
50 30
20
40
80 90
35
85
32
88
其双亲结点中相应指针域的值改为“空”
(2) 被删除结点只有左子树或只有右子树
50 30
20
40
被删关键字=40 80
80 90
35
85
32
88
其双亲结点的相应指针域的值改为“指向被 删除结点的左子树或右子树”。
第9章 查找
查找
查找,也称检索,目标是从数据记录中找 到符合某个给定条件的数据记录。查找的 方法大致可分为顺序查找、折半查找与分 块查找等几种类型。
2
查找
顺序查找 顺序查找是一种简单的查找方法,其基本
思想是从表的一端开始,顺序扫描线性表, 依次将扫描到的结点元素值与给定的关键字 key相比较,若结点元素值与key相等,则查 找成功;若扫描完所有结点,仍未找到等于 key的结点,则查找失败。
low = mid + 1 # 如果中间值比目标值小,则在mid右半边
elif a[mid] > num:
high = mid – 1 边找
# 如果中间值比目标值大,则在mid左半
else: return mid
return -1
#查找到,位置是mid+1 #没查到
每执行一次while循环, 搜索空间减少一半。在最坏情 况下,while循环被执行O(logn) 次。循环体内运算需要执 行O(1) 次,因此整个算法的计算时间复杂度为O(logn) 。
22
插入
def insert(self, key):
#插入操作
bt = self._root
if not bt:
self._root = BSTNode(key)
return
while True:
entry = bt.data
if key < entry:
if bt.left is None:
bt.left = BSTNode(key)
15 i=3
1 2 5 7 8 11 14 20
14 i=4 1 2 5 7 8 11 14 20
15 i=4 1 2 5 7 8 11 14 20
14 i=5
15 i=5
1 2 5 7 8 11 14 20
1 2 5 7 8 11 14 20
14 i=6(找到)
15 i=6 1 2 5 7 8 11 14 20
12
二叉查找树
13
二叉查找树
14
3.二叉排序树的插入算法
根据动态查找表的定义,“插入”操作在查 找不成功时才进行;
(1)若二叉排序树为空树,
则新插入的结点是新的根结点
设 key = 30
30
(2)若二叉排序树非空, 则新插入的结点是新的叶子结点, 且插入的位置由查找过程得到 。
设 key = 25 48
关键 12 25
16

67 56
29
相关文档
最新文档