数据结构
数据结构有两个概念、逻辑结构,物理结构(存储)
逻辑结构:描述数据节点之间的关系。
物理结构:描述数据在内存中是如何存储的(分配内存空间)。
逻辑结构
集合结构,线性结构,树状结构,网络结构(图形)
集合结构
数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
线性结构
元素存在一对一的相互关系
树状结构
元素存在一对多的相互关系
网络结构(图形)
元素存在多对多的相互关系
物理结构(存储)
物理结构又叫存储结构,分为以下四种:
顺序存储结构:顺序存储结构。
非顺序存储结构:链式存储结构、索引结构、散列结构。
顺序存储结构
数据存储内存空间是连续的
链式存储结构
数据存储内存空间是不连续的
索引存储结构
分别存放数据元素和元素间关系的存储方式,存在索引(index)用以检索数据
散列存储结构(哈希)
分别存放数据元素和元素间关系的存储方式,将关键码(key)经函数映射后(通常为 hash)得到数组索引(index),根据数组特性,通过 index 即可得到数据存储地址(addr)
// Java hashMap 映射函数 i:index , n:table.length , hash:hashcode
i = (n - 1) & hash
数据结构对性能的影响
(1)检索。检索就是在数据结构里查找满足一定条件的节点。一般是给定一个某字段的值,找具有该字段值的节点。 [3]
(2)插入。往数据结构中增加新的节点。
(3)删除。把指定的结点从数据结构中去掉。
(4)更新。改变指定节点的一个或多个字段的值。
(5)排序。把节点按某种指定的顺序重新排列。例如递增或递减。
通常,评估一种数据结构会有如下指标:
- 常用数据操作(随机情况下)的速度(查询、插入、删除、修改、排序);
- 内存利用率,内存扩展性;
- 存储密度;
- 存储数据类型是否灵活;
- 随机访问性如何(影响数据操作速度即时间复杂度);
最终,一种数据结构的性质表现,会由逻辑结构,存储结构,加其额外定义的规则决定(如栈,限制了只允许栈顶对数据进行操作)。同一存储结构也会因为不同的定义导致差异(如无序数组插入速度比有序数组快,因为无序数组直接在队尾插入数据,不需要挪动数据的位置),也就是说得具体问题还得具体分析。
数组,随机插入数据则时间复杂度为O(n),只在队尾插入则为O(1) ,所有答案如何全看前提条件是什么。