概念及思路
- 先看一个需求:
- 稀疏数组:
- 稀疏数组的转换规则:
(1)第0行用来统计:包括三个重要录入元素:有多少行(用len(row),行的索引是从0开始的);有多少列(用len(col),但列的索引从0开始);通过行和列确定的一行中某一个值
(2)行的增加过程是:先从原数组中一行一行的读取,要读取完本行中所含的所有数据,才进行下一行的添加,如下图:
- 应用过程
实现
-
原二维数组转成稀疏数组的思路:
(1)遍历 原始的二维数组,得到有效的数据个数 sum
(2)根据 sum 来创建 二维的 稀疏数组 sparse_array
(3)将二维数组的有效数据存入 稀疏数组 sparse_array -
稀疏数组转原始的二维数组的思路:
(1)先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chess_array=[ 11] [11]
(2)读取稀疏数组后几行的数据,并赋值给原始的二维数组 -
流程:
class SparseArray(object):
def print_array(self, array): # 打印测试
for row_item in array:
for data in row_item:
print("%d" % data, end=" ")
print()
def make_sparse_array(self, array): # 将二维数组 转 稀疏数组
if array == "":
return
total = 0
for row_num in range(len(array)):
for col_num in range(len(array[0])):
if array[row_num][col_num] != 0:
total += 1
# 开始创建稀疏数组
sparse_array = [[0 for i in range(3)] for j in range(total + 1)]
sparse_array[0][0] = len(array)
sparse_array[0][1] = len(array[0])
sparse_array[0][2] = total
# 遍历二维数组,将非0的值存放到 sparse_array 中
count = 0
for row_index, row_item in enumerate(array):
for col_index, col_item in enumerate(row_item):
if col_item:
count += 1
sparse_array[count][0] = row_index
sparse_array[count][1] = col_index
# sparse_array[count][2] = chess_array[row_index][col_index]
sparse_array[count][2] = col_item
return sparse_array
def back_array(self, array): # 将稀疏数组 还原 二维数组
previous_array = [[0 for i in range(array[0][0])] for j in range(array[0][1])]
for index, item in enumerate(array):
if index == 0:
continue
previous_array[item[0]][item[1]] = item[2]
return previous_array
if __name__ == '__main__':
row = 11 # 得到行数
col = 11 # 得到列数
chess_array = [[0 for i in range(col)] for j in range(row)]
# 给原始二维数组输入值
chess_array[1][2] = 1
chess_array[2][3] = 2
chess_array[4][5] = 2
# 实例测试
obj = SparseArray()
obj.print_array(chess_array)
sparse_array = obj.make_sparse_array(chess_array)
obj.print_array(sparse_array)
previous_array = obj.back_array(sparse_array)
obj.print_array(previous_array)
# print(obj.make_sparse_array(chess_array))
# print(obj.back_array(obj.make_sparse_array(chess_array)))