数据结构与算法--稀疏数组 Python实现稀疏数组 稀疏数组 python描述

阅读目录

概念及思路

  • 先看一个需求:
    在这里插入图片描述
    在这里插入图片描述
  • 稀疏数组:
    在这里插入图片描述
  • 稀疏数组的转换规则:
    (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)))

在这里插入图片描述

发布了146 篇原创文章 · 获赞 37 · 访问量 7867

猜你喜欢

转载自blog.csdn.net/storyfull/article/details/103550341