yumoz

第二章:数组结构

2.1 线性表简介

1 线性表:

  1)有序表可以是空集合,或者写成(a1,a2,a3,......,an,an

  2)存在唯一的第一个元素a1和唯一最后一个元素an。

  3)除了第一个元素a外,每一个元素都有唯一的先行者。

  4)除了最后一个元素an 外,每一个元素都有唯一的后继者。

2 线性表存储结构:

  静态数据结构:也称为“密集表”,它使用连续分配的内存空间来存储有序表中的数据。(静态数据结构是在编译时就给相关的变量分配好内存空间。在建立静态数据结构的初期,必须声明最大可能要占用的固定内存空间,因此容易造成内存浪费。优点:设计简单,读取与修改表中任意元素的时间是固定的。缺点:删除或加入数据时,需要移动大量数据)

  动态数据结构:也称为“链表”,它使用不连续的内存空间存储具有线性表特性的数据。(优点:数据的插入或删除都相当方便,不需要移动大量数据。内存是在程序执行时才进行分配,所以不需要事先声明,节省内存。缺点:设计数据结构麻烦,查找数据时,无法像静态数据一般可以随机读取,必须直到按顺序找到改数据为止)

2.2 认识数组

1 数组类型的声明:

  1)起始地址:表示数组名(或数组第一个元素)所在内存中的起始地址。

  2)维度:一维、二维、三维。

  3)索引上下限:

  4)数组元素个数:是索引上限和索引下限的差加1。

  5)数组类型:声明此数组的类型,它决定数组元素在内存所占容量的大小。

  程序1是记录5个人分数,然后求平均值。

1 # 记录5个人分数,然后求平均
2 #一维列表使用
3 Score = [87,66,90,65,70]
4 Total_Score = 0
5 for count in range(5):
6     print('第 %d 位学生的分数:%d' %(count+1,Score[count]))
7     Total_Score += Score[count]
8 print('--------------------------')
9 print('5位学生的总分:%d' %Total_Score)
View Code

  程序2表示的是输入一个二维列表表示的二阶行列式,并计算结果。

 1 N = 2
 2 # 声明二维数组
 3 arr = [ [None]*N for row in range(N) ]
 4 print('|a1  b1|')
 5 print('|a2  a2|')
 6 arr[0][0] = input('请输入a1:')
 7 arr[0][1] = input('请输入b1:')
 8 arr[1][0] = input('请输入a2:')
 9 arr[1][1] = input('请输入b2:')
10 #求第二阶行列式的值
11 result = int(arr[0][0]) * int(arr[1][1]) - int(arr[0][1])*int(arr[1][0])
12 print('|%d  %d|'    %(int(arr[0][0]),int(arr[0][1])))
13 print('|%d  %d|'    %(int(arr[1][0]),int(arr[1][1])))
14 print('行列式值=%d' %result)
View Code

  程序3表示的找出2 X 3 X 3 三维数组中存储数值的最小值。

 1 # 三维数组
 2 num = [ [ [33,45,67],[23,71,66],[55,38,66] ],\
 3        [ [21,9,15],[38,69,18],[90,101,89] ] ]
 4 value = num[0][0][0]
 5 print(num)
 6 for i in range(2):
 7     for j in range(3):
 8         for k in range(3):
 9             if(value>=num[i][j][k]):
10                 value = num[i][j][k]
11 print("最小值= %d" %value)
View Code

 

2.3 矩阵

矩阵作为一种常用的数据结构,在数据计算中比较常用。此节主要讨论两个矩阵的相加、相乘,以及某些稀疏矩阵、转置矩阵、上三角矩阵和下三角矩阵等。

1 矩阵相加

  矩阵的相加比较简单,只要求两矩阵对应的行数和列数都相等,相加后的矩阵也同样行列数矩阵。

  程序4列出两个矩阵的相加及结果的程序。

 1 #声明两个数组来实现两个矩阵的相加
 2 A = [[1,3,5],[7,9,11],[13,15,17]] #二维数组的声明
 3 B = [[9,8,7],[6,5,4],[3,2,1]]
 4 N = 3
 5 C = [ [None] * N for row in range(N) ]
 6 
 7 for i in range(3):
 8     for j in range(3):
 9         C[i][j] = A[i][j] + B[i][j] #矩阵相加
10 print('矩阵A和矩阵B相加的结果:')
11 for i in range(3):
12     for j in range(3):
13         print('%d' %C[i][j],    end='\t')
14     print('\n')
View Code

2 矩阵相乘

  矩阵相乘有一些限制,两个矩阵A和B相乘,必须是A矩阵的列和B矩阵的行相同。例如:A:m X n,B:n X p ,则A X B = m X p矩阵。

  程序5表示的是设计程序实现两个可自行输入矩阵维数的矩阵相乘过程,并显示结果。

 1 # 可以实现两个自行输入矩阵维度的矩阵相乘,并输出结果
 2 def MatrixMultiply(arrA,arrB,arrC,M,N,P):
 3     global C
 4     if M<=0 or N<=0 or P<=0:
 5         print('[错误:维数M,N,P必须大于0]')
 6         return
 7     for i in range(M):
 8         for j in range(P):
 9             Temp = 0
10             for k in range(N):
11                 Temp = Temp + int(arrA[i*N+k])*int(arrB[k*P+j])
12             arrC[i*P+j] = Temp
13 
14 print('请输入矩阵A的维数(M,N):')
15 M = int(input('M= '))
16 N = int(input('N= '))
17 A = [None]*M*N  #声明大小为M*N的列表A
18 
19 print('请输入矩阵A的各个元素:')
20 for i in range(M):
21     for j in range(N):
22         A[i*N+j]=input('a%d%d=' %(i,j))
23 
24 print('请输入矩阵B的维数(N,P):')
25 N = int(input('N= '))
26 P = int(input('P= '))
27 
28 B = [None]*N*P #声明N*P的列表B
29 
30 print('[请输入矩阵B的各个元素]')
31 for i in range(N):
32     for j in range(P):
33         B[i*P+j] = input('b%d%d=' %(i,j))
34 
35 
36 C = [None]*M*P #声明大小为M*P的列表C
37 MatrixMultiply(A,B,C,M,N,P) # 函数调用
38 print('A X B 的结果是:')
39 for i in range(M):
40     for j in range(P):
41         print('%d' %C[i*P+j],end='\t')
42     print('\n')
View Code

  针对上述的程序,重点在于定义的相乘函数。

def MatrixMultiply(arrA,arrB,arrC,M,N,P):
    global C
    if M<=0 or N<=0 or P<=0:
        print('[错误:维数M,N,P必须大于0]')
        return
    for i in range(M):
        for j in range(P):
            Temp = 0
            for k in range(N):
                Temp = Temp + int(arrA[i*N+k])*int(arrB[k*P+j])
            arrC[i*P+j] = Temp

3 矩阵转置

  转置矩阵就是把原矩阵的行坐标和列坐标元素相互调换。

  程序6展示的是一个4*4二维数组的转置。

 1 # 4 X 4 二维数组的转置
 2 
 3 arrA = [ [1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16] ]
 4 N = 4
 5 #声明4 X 4 数组arr
 6 arrB = [ [None]*N for row in range(N) ]
 7 
 8 print('原设置的矩阵内容:')
 9 for i in range(4):
10     for j in range(4):
11         print('%d' %arrA[i][j],end='\t')
12     print(' ')
13 
14 # 进行矩阵的转置操作
15 for i in range(4):
16     for j in range(4):
17         arrB[i][j]=arrA[j][i]
18 
19 print('转置矩阵的内容为:')
20 for i in range(4):
21     for j in range(4):
22         print('%d' %arrB[i][j],end='\t')
23     print(' ')
View Code

4 稀疏矩阵

  定义:如果一个矩阵中的大部分元素为零,就被称为稀疏矩阵。

  缺点:如果一个矩阵里面0元素过于多,存储就特别占内存空间,于是需要提高效率使用三项式的数据结构。

  假如一个稀疏矩阵有n个非零项,那么可以利用一个A(0:n,1:3)二维数组来存储这些非零项,称之为矩阵的压缩矩阵。

  程序7展示的是一个6*6的稀疏矩阵压缩过程及结果。

 1 # 设计一个python程序利用三项式数据结构,并压缩6*6稀疏矩阵,以减少内存不必要的浪费
 2 NONZERO = 0
 3 temp = 1
 4 Sparse = [ [25,0,0,22,0,-15],[0,11,3,0,0,0],
 5            [0,0,0,-6,0,0],[0,0,0,0,0,0],
 6            [91,0,0,0,0,0],[0,0,28,0,0,0] ]
 7 Compress = [ [None]*3 for row in range (9) ] #声明压缩矩阵
 8 
 9 print('稀疏矩阵的各元素个数') #打印系数矩阵的各个元素
10 for i in range(6):
11     for j in range(6):
12         print('[%d]'    %Sparse[i][j],end=' ')
13         if Sparse[i][j] != 0:
14             NONZERO = NONZERO +1
15     print(' ')
16 
17 # 开始压缩稀疏矩阵
18 Compress[0][0]=6
19 Compress[0][1]=6
20 Compress[0][2]=NONZERO
21 
22 for i in range(6):
23     for j in range(6):
24         if Sparse [i][j] != 0:
25             Compress[temp][0]=i
26             Compress[temp][1]=j
27             Compress[temp][2]=Sparse[i][j]
28             temp = temp + 1
29 
30 print('稀疏矩阵压缩后的内容')
31 for i in range(NONZERO+1):
32     for j in range(3):
33         print('[%d]'    %Compress[i][j],end=' ')
34     print(' ')
View Code

5 上三角形矩阵

  

 

2.4 数组与多项式

 


 

后记:

1)详细补充随后附上

2)思考一下,总结一下。

posted @ 2020-09-08 21:36  yumoz  阅读(304)  评论(0编辑  收藏  举报