数据结构是所有算法的基础,只有精通于数据结构才能深入学习算法从而在现有算法的基础上进行优化、创新。
1、基本概念
数据、数据元素、数据项:数据项(字段、属性、域)组成数据元素(元素、记录、节点、顶点);数据元素组成数据。
数据结构:顾名思义数据的结构 通俗一点就是:数据在计算机中怎么存储的 是以怎样的组织结构存储的 他们之间有何关系 怎么操作这些数据。
逻辑结构:
线性结构:一头一尾 直线型 无分叉 (线性表、栈、队列、串)
非线性结构:有分叉(多维数组、树、图)
存储结构:
顺序存储:相邻 依次存储 (数组)
链接存储:不一定相邻 单独存储逻辑关系(指针)
索引存储:附加存储索引表 一对一的成稠密索引 一对多的称稀疏索引(指向开始位置)
散列存储:根据记录(节点)关键字计算存储位置
同一逻辑结构可以使用不同存储结构存储 exp:线性表 顺序存储-》顺序表;链接存储-》链表;散列存储-》散列表。
案例:田径赛程安排
姓名 | 项目1 | 项目2 | 项目3 |
---|---|---|---|
甲 | 跳高 | 跳远 | 100米 |
乙 | 标枪 | 铅球 | |
丙 | 标枪 | 100米 | 200米 |
丁 | 铅球 | 200米 | 跳高 |
戊 | 跳远 | 200米 |
要求最短时间内完成比赛
这里我们使用数据结构中的无向图解决该问题:
首先将6个比赛项目设为6个点,任何一个运动员参加的项目不能同时进行,我们将其连接起来
得到如下图形:
然后依次对上图中相互之间没有连接的项目(顶点)着同一颜色(已经着色的不需要再次参与着色),意思就是没有人同时参加的项目可以同时进行, 首先我们看到跳高和标枪之间没有连接(使用红色); 铅球和跳远之间没有连接(使用黄色);剩下的就是100米和200米,他们之间有连接所以分别使用蓝色和绿色。由此得到下图:
由此我们可以得到最省时间的赛程为:跳高与标枪同时进行;跳远与铅球同时进行;100米、200米单独进行。
【个人观点】此示例没有考虑每项比赛实际上使用的时间长短,现实生活中可能会出现一个运动员的两项比赛同时进行,参与完一项另一项比赛可能还没有轮到你上场。。。。哈哈 多线程程序以及分布式程序里也存在这种情况 谁闲着谁去干。大家理解这个思想就好,没必要钻这个牛角尖。
算法复杂度:时间复杂度、空间复杂度,一般情况下时间复杂度比较重要(也就是程序运行时间)。
常见时间复杂度:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n2)、立方阶O(n3)、...、k次方阶O(nk)、指数阶O(2n)。
算法中包含循环的以最内层的循环次数计算算法时间复杂度(理论最长时间)。