Python数据结构实验 查找实验(一)

一、实验目的

1.熟悉查找的基本概念,包括静态查找表和动态查找表、内查找和外查找之间的差异以及平均查找长度等;

2.掌握线性表上的各种查找算法,包括顺序查找、折半查找和分块查找的基本思路、算法实现和查找效率等;

3.灵活运用线性表各种查找算法解决一些综合应用问题。

二、实验环境

1.Windows操作系统的计算机

2.Python3.7环境平台和PyCharm编辑器

三、实验说明 

1.实现线性表上的各种相关算法程序设计和查找过程。    
2.实验中如无特别说明,均要求使用脚本(.py)方式编写代码。

3.自主编写程序,必要时参考相关资料。

4.实验学时:2学时

四、实验内容和步骤

1.实验内容

(1) 编写一个实验程序,对一个递增有序表进行折半查找,输出成功找到其中每个元素的查找序列,用相关数据进行测试。

参考思路:

def BinSearch(R,k):     #拆半查找非递归算法

    n=len(R)

    L=[]                                                                 #存放查找序列

    low,high=0,n-1

while low<=high:      #当前区间非空时

        mid=(low+high)//2      #求查找区间的中间位置

        L.append(R[mid])

        if k==R[mid]:

              return L

        if k<R[mid]:      #继续在R[low..mid-1]中查找

                  ……





#主程序

a=[______            ]

print()

print("  整数序列:",a)

for i in range(len(a)):

    L=_________

    print("  查找%d的查找序列:" %(a[i]),end='')

    print(L)







(2)假设一个带权图G采用邻接矩阵存储,设计一个算法,采用狄克斯特拉算法思路,求顶点s到顶点t的最短路径长度(假设顶点s和t都是G中的顶点)。

参考思路:

from MatGraph import MatGraph,INF,MAXV



def Dijkstra(g,s,t):                      #基本Dijkstra算法,求从s到t的最短路径长度

    dist=[-1]*MAXV                      

    S=[0]*MAXV                         

    for i in range(n):

        dist[i]=g.edges[s][i]           

    S[s]=1                         

    u=-1

    for i in range(n-1):              

        mindis=INF                    

        for j in range(n):   

            if S[j]==0 and dist[j]<mindis:

                u=j

                mindis=dist[j]

        if u==t:return dist[t]              

        S[u]=1                        

        for j in range(n):            

            if S[j]==0:                   

                if g.edges[u][j]<INF and dist[u]+g.edges[u][j]<dist[j]:

                    dist[j]=dist[u]+g.edges[u][j]

    return INF





#主程序

g=MatGraph()

n,e=_ _,_  _

a=[……]                                              #图7.35的边数组

g.CreateMatGraph(a,n,e)

print("图g")

g.DispMatGraph()

s=_   _

t=_   _

print("求解结果");

print("%s->%d的最短路径长度:%d" %(s,t,Dijkstra(g,s,t)))





2.实验步骤

(1)分析实验内容,写出程序大致框架或完整的程序代码。

(2)进入Python集成环境。

(3)编辑程序并进行保存。

(4)运行程序,若有错误,修改错误后再次运行,如此反复进行到不显示出错为止。

(5)检查程序输出结果。

五、实验代码与结果(程序运行代码及其结果)

1. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

def BinSearch(R,k):          #拆半查找非递归算法

    n=len(R)

    L=[]                                                                 #存放查找序列

    low,high=0,n-1

    while low<=high:      #当前区间非空时

            mid=(low+high)//2  #求查找区间的中间位置

            L.append(R[mid])

            if k==R[mid]:

                  return L

            if k<R[mid]: #继续在R[low..mid-1]中查找

                high=mid-1

            else:     #k>R[mid]

               low=mid+1 #继续在R[mid+1..high]中查找

    return -1         #当前查找区间空时返回-





#主程序

a=[2,4,7,8,9,10,14,18,26,32,40]

print()

print("  整数序列:",a)

for i in range(len(a)):

    L=BinSearch(a,a[i])

    print("  查找%d的查找序列:" %(a[i]),end='')

print(L)


2. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

from 图 import MatGraph,INF,MAXV



def Dijkstra(g,s,t):                      #基本Dijkstra算法,求从s到t的最短路径长度

    dist=[-1]*MAXV

    S=[0]*MAXV

    for i in range(n):

        dist[i]=g.edges[s][i]

    S[s]=1

    u=-1

    for i in range(n-1):

        mindis=INF

        for j in range(n):

            if S[j]==0 and dist[j]<mindis:

                u=j

                mindis=dist[j]

        if u==t:return dist[t]

        S[u]=1

        for j in range(n):

            if S[j]==0:

                if g.edges[u][j]<INF and dist[u]+g.edges[u][j]<dist[j]:

                    dist[j]=dist[u]+g.edges[u][j]

    return INF





#主程序

g=MatGraph()

n,e=6,10

a=[[1,3,1,4,INF,INF],

    [1,3,1,INF,4,INF],

    [5,2,0,5,2,1],

    [8,INF,8,8,INF,8],

    [INF,6,6,INF,6,6],

    [INF,INF,9,9,9,9]]                                              #图7.35的边数组

g.CreateMatGraph(a,n,e)

print("图g")

g.DispMatGraph()

s=1

t=9

print("求解结果");

print("%s->%d的最短路径长度:%d" %(s,t,Dijkstra(g,s,t)))

  • 13
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是数据结构查找排序实验的步骤和示例: 1. 二叉排序树查找: - 构造二叉排序树:根据给定的数据,构造一个二叉排序树。 - 查找元素:在二叉排序树中查找指定的元素。 示例: ```python # 构造二叉排序树 class Node: def __init__(self, value): self.value = value self.left = None self.right = None def insert(root, value): if root is None: return Node(value) if value < root.value: root.left = insert(root.left, value) else: root.right = insert(root.right, value) return root def construct_tree(data): root = None for value in data: root = insert(root, value) return root # 查找元素 def search(root, value): if root is None or root.value == value: return root if value < root.value: return search(root.left, value) return search(root.right, value) # 测试数据 data = [150, 70, 160, 190, 10, 55, 175] root = construct_tree(data) # 查找元素 elements = [150, 70, 160, 190, 10, 55, 175] for element in elements: result = search(root, element) if result: print(f"元素 {element} 在二叉排序树中找到了") else: print(f"元素 {element} 在二叉排序树中未找到") ``` 2. 二分查找: - 准备有序数据表:准备一个有序的数据表。 - 二分查找元素:在有序数据表中使用二分查找算法查找指定的元素。 示例: ```python def binary_search(data, target): low = 0 high = len(data) - 1 while low <= high: mid = (low + high) // 2 if data[mid] == target: return mid elif data[mid] < target: low = mid + 1 else: high = mid - 1 return -1 # 测试数据 data = [10, 55, 70, 150, 160, 175, 190] elements = [150, 70, 160, 190, 10, 55, 175] # 二分查找元素 for element in elements: index = binary_search(data, element) if index != -1: print(f"元素 {element} 在数据表中的下标为 {index}") else: print(f"元素 {element} 在数据表中未找到") ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值