声明:文章为博主原创,转载请联系博主。文章若有错误和疏漏之处,还望大家不吝赐教!
                                               第一章:数据结构与算法基础

===========================================================
本章重点内容为:
1.数据结构基础与线性表:下三角矩阵元素存储位置计算、队列的特性应用、栈的特性应用
2.广义表:无
3.树:二叉树的特性、二叉树的遍历、哈夫曼树
4.图:边与顶点的关系
5.查找与排序:折半查找、基数排序算法以及这些算法的性能分析
6.算法基础知识:时间复杂度分析
===========================================================
本篇文章主要介绍下三角矩阵元素存储位置计算。

一. 概念介绍
首先,我们应该明确一点:为什么要计算下三角矩阵的元素存储位置?答案是,这一切都是为了矩阵
的压缩存储。在我们存储矩阵数据时,为了节省存储空间,我们会对下面两种矩阵进行压缩存储:
1.对称矩阵:即以主(副)对角线为界,两边三角区域中元素严格对称的矩阵。
2.三角矩阵:即以主(副)对角线为界,两边三角区域一边为单一元素的矩阵。
例如:
     

二. 压缩算法
大致思路:
1. 对于对称矩阵,我们可以只存储下三角矩阵的元素和对角线上的元素,然后交换下三角矩阵的横纵
    坐标便可以得到下三角矩阵对称区域的元素。
2. 对于三角矩阵,由于上三角区域的元素值都是相同的,我们只存储下三角区域和对角线上的元素即
    可,上三角矩阵的元素用一个数值存储就可以。

由上可知,无论是对称矩阵,还是三角矩阵,对它们进行压缩的基础都是如何对下三角区域的矩阵进
行存储(上三角矩阵存储和下三角矩阵相反,故只介绍下三角矩阵存储 )。了解了算法思路以后,我们
来看下三角矩阵到底是如何进行存储的。

三. 下三角矩阵的存储
由于存储单元为线性结构,所以我们将矩阵中的元素以一维数组的形式存储起来。我们以上面的对称
矩阵为例,我们要存储的数据实际上是下面左图中的部分,我们的目的是将左边这部分数据转化成右
边一维数组的形式存储起来:
 
也就是说,我们要将左边矩阵元素的坐标 [i,j] 转换为右边一维数组元素的坐标[k],如何转换?通过观
察我们发现:k实际上等于元素(i,j)前面的元素个数,即:
k = (i,j)前面元素的数目
而(i,j)前面元素的数目可以分为两部分来计算:
(1) 元素(i,j)所在行前面所有行元素的数目;
(2) 元素(i,j)所在行中,它前面元素的个数。

下面我们将这两部分分开来计算:
(1) 元素(i,j)所在行前面所有元素的数目:
     这部分可以用等差数列来计算:个数 = [(首项+尾项)*项数]/2 = [(1+(i-1))*(i-1)]/2 = i(i-1)/2
     解释:首项:显然,首项只有一个元素;尾项:尾项为第(i-1)行元素的个数,由于是n阶矩阵,所
                以第(i-1)行元素个数为(i-1)个;项数:一共要把从1到第(i-1)行的元素相加,故项数为(i-1)
(2) 元素(i,j)所在行中,它前面元素的个数:
      这个很容易计算,用该元素列坐标减1即可,即: 个数 = (j-1)

将上面两部分相加,便可以得到下三角矩阵元素存储位置:k = i(i-1)/2+j-1, 其中( i >= j )
另外:上三角部分计算方式与下三角部分一致,由于元素对称 ,直接交换 i ,j 顺序即可。但是要注意
交换的范围:即只有在(i<j)时才需要交换。

总结:
下三角矩阵元素存储位置:
k = i(i-1)/2+j-1,( i >= j )
对称矩阵元素存储位置:
下三角部分:k = i(i-1)/2+j-1,( i >= j )
上三角部分:k = j(j-1)/2+i-1,( i < j )

三角矩阵元素存储位置:
下三角部分:k = i(i-1)/2+j-1,( i >= j )
上三角部分:k = n(1+n)/2,( i < j )

解释:在三角矩阵中,上三角部分元素的值都是相同的,所以只用一个存储位置将其存放在下三角所
有元素之后即可。下三角元素共有 S = (1+n)n/2 个,所以上三角元素占据第 (S+1) 个位置,而一维
数组计数从0开始,所以上三角部分元素的位置为 S = (1+n)n/2

其他类型如上三角矩阵的元素位置计算与下三角矩阵类似,不再赘述,详细可参考下面这篇文章:
数据结构----三角矩阵压缩存储中下标的计算_SWEENEY_HE的博客-CSDN博客_数据结构三角矩阵

第 1 章之:下三角矩阵元素存储位置计算相关推荐

  1. Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标

    *8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置.返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标 题目 题目描述与运行示例 破题 代码 题目 ...

  2. C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用...

    这几天一直在复习C#基础知识,过程中也发现了自己以前理解不清楚和混淆的概念.现在给大家分享出来我的笔记: 一,.NET平台的重要组成部分都是有哪些 1)FCL (所谓的.NET框架类库) 这些类是微软 ...

  3. 哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding

    哈希表添加 哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加 ...

  4. java array 元素的位置_JAVA集合类,有这一篇就够了

    在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是JavaAPI提供了多种集合的实现,我在使用和面试的时候频频遇到这样的"抉择" . :)(主要还是面试 ...

  5. 纠正存储 dict 的元素前是计算 key 的 hash 值?

    前几天发了一篇名为 存储 dict 的元素前是计算 key 的 hash 值? 的文章,因缺乏相关的背景知识,导致得出了不正确的推论. 那篇文章的推论是 在不考虑 hash 冲突的情况下, 'a' 所 ...

  6. android指定sqlite路径_android sqlite 存储位置

    Android 开发中使用 SQLite 数据库 SQLite 是一款非常流行的嵌入式数据库,它支持 SQL 查询,并且只用很少的内存.Android 在运行时集成了 SQLite,所以每个 Andr ...

  7. 乐鑫esp8266学习rtos3.0笔记第3篇: 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  8. 以域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。给出队满条件和相应的如对和出队算法。

    以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素的个数.给出队满条件和相应的如对和出队算法. /* 以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素 ...

  9. R语言修改下载安装包install.package的默认存储位置

    这次遇到的问题是:R语言下载安装包时会先将下载下来的二进制zip文件保存在本地,然后将其解压安装到R的library文件夹下.包被下载后会默认将二进制zip文件保存在本地C盘的临时会话的downloa ...

最新文章

  1. 超级队长VR线下体验店落地上海,让娱乐突破想象
  2. 初学者自学python要看什么书-初学者如何学习Python?掌握这17个实用小技巧快速入门!...
  3. python英文翻译-Python运算符-局部英文翻译版
  4. JQuery 实现遮罩层
  5. matlab波的极化特性,Matlab GUI在电磁波极化特性教学中的应用
  6. 我买网勾搭搜狐吃货自媒体联盟 大搞自媒体“晒图”营销?
  7. 《Python Cookbook 3rd》笔记(2.4):字符串匹配和搜索
  8. python网络平台_python学习(九) 网络编程学习--简易网站服务器
  9. MFC可编辑CListCtrl
  10. Java之简单人机五子棋(一)
  11. 无穷项和求极限(定积分)
  12. linux上编译stm32工程,Linux下如何搭建stm32开发环境
  13. 肠道微生物群与过敏性鼻炎
  14. 测试工程师的福利!各远程移动测试平台对比分析
  15. git使用报错:fatal: Couldn‘t find remote ref master的解决方法
  16. 计算机组装与维护doc,新版计算机组装与维护.doc
  17. java初中学历_20岁学java初中学历
  18. 经典黑白搭配 现代简约风格设计美学精神
  19. 重磅消息!Java之内存泄漏调试学习与总结,分享PDF高清版
  20. TransE模型的python代码实现

热门文章

  1. 夺命雷公狗—玩转SEO---4---什么是展现量和点击率
  2. 实用网页制作工具集锦
  3. CNN进行非接触掌纹识别的改进过程
  4. 构建安全可靠的微服务 | Nacos 在 SaaS 平台的应用实践
  5. 做互联网不要把自己看得太高
  6. JTable 合并单元格 简易实现
  7. plantuml使用
  8. 微信中页面二次分享小图标丢失问题
  9. 基于fpga的均值滤波
  10. 加米谷大数据干货:Kafka如何实现每秒上百万的超高并发写入?