IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构-稀疏数组 -> 正文阅读

[数据结构与算法]数据结构-稀疏数组

数据结构

数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后间关系,而与他们在计算机中的存储位置无关。逻辑结构包括:

  1. 集合:数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
  2. 线性结构:数据结构中的元素存在一对一的相互关系;
  3. 树形结构:数据结构中的元素存在一对多的相互关系;
  4. 图形结构:数据结构中的元素存在多对多的相互关系。

数据的逻辑结构在计算机存储空间中的存放形式称为数据的物理结构(也称为存储结构)。一般来说,一种数据结构的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序存储、链式存储、索引存储和哈希存储等。

数据的顺序存储结构的特点是:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系;非顺序存储的特点是:借助指示元素存储地址的指针表示数据元素之间的逻辑关系。

数据结构有很多种,一般来说,按照数据的逻辑结构对其进行简单的分类,包括线性结构和非线性结构两类。
线性结构:
简单地说,线性结构就是表中各个结点具有线性关系。如果从数据结构的语言来描述,线性结构应该包括如下几点:

  • 线性结构是非空集。
  • 线性结构有且仅有一个开始结点和一个终端结点。
  • 线性结构所有结点都最多只有一个直接前趋结点和一个直接后继结点。
    线性表就是典型的线性结构,还有栈、队列和串等都属于线性结构。

非线性结构:
简单地说,非线性结构就是表中各个结点之间具有多个对应关系。如果从数据结构的语言来描述,非线性结构应该包括如下几点:
1、非线性结构是非空集。
2、非线性结构的一个结点可能有多个直接前趋结点和多个直接后继结点。
在实际应用中,数组、广义表、树结构和图结构等数据结构都属于非线性结构。

稀疏数组

当一个数组中大部分元素都为0或者是同一值时,为了节省空间,可以使用稀疏数组来保存该数组。

稀疏数组将会记录原数组一共有几行几列,一共有多少不同的值,并且将具有不同值的元素和行列及值记录在一个小规模的数组之中,从而缩小程序的规模。

假设我们现在需要编写一个五子棋程序,且这个程序具有存盘和续上盘的功能,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rDtLRrUq-1631977484851)(数据结构.assets/image-20210910141702112.png)]

分析问题:因为该数组中绝大部分数据是默认值0,记录了很多没有意义的数据,所以可以采用稀疏数组。

稀疏数组的处理方式是:

  • 记录数组中一共有几行几列,有多少个不同的值
  • 把具有不同的值的元素的行列及值留在一个小规模的数组中,从而缩小程序的规模

稀疏数组举例说明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Sunb5Vk-1631977484853)(C:/Users/12709/AppData/Roaming/Typora/typora-user-images/image-20210910142011319.png)]

整体思路分析:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uamronca-1631977484854)(C:/Users/12709/AppData/Roaming/Typora/typora-user-images/image-20210910141803822.png)]

public class SparseArray {
    public static void main(String[] args) throws IOException {
        int[][] array = new int[11][11];
        array[0][1] = 1;
        array[0][2] = 2;
        PrintArray(array);
        // 值的总数
        int number = 0;
        for (int[] ints : array) {
            for (int anInt : ints) {
                if (anInt != 0) {
                    number++;
                }
            }
        }
        System.out.println("=================================================");
        // 将二维数组转为稀疏数组
        int[][] SparseArray = new int[number + 1][3];
        int count = 1;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                // 原二维数组的行数
                SparseArray[0][0] = array.length;
                // 原二维数组的列数
                SparseArray[0][1] = array[array.length -1].length;
                SparseArray[0][2] = number;
                if (array[i][j] != 0) {
                    SparseArray[count][0] = i;
                    SparseArray[count][1] = j;
                    SparseArray[count][2] = array[i][j];
                    count++;
                }
            }
        }
        PrintArray(SparseArray);
        System.out.println("=================================================");
        // 将稀疏数组转为二维数组
        int[][] ReArray = new int[SparseArray[0][0]][SparseArray[0][1]];
        for (int i = 1; i < SparseArray.length; i++) {
            ReArray[SparseArray[i][0]][SparseArray[i][1]] = SparseArray[i][2];
        }
        PrintArray(ReArray);
    }
    // 打印二维数组
    public static void PrintArray(int[][] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + "\t\t");
            }
            System.out.println();
        }
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 08:13:59  更:2021-09-19 08:14:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 11:11:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码