数据结构和算法读书笔记
1.疑惑:数据结构和算法是什么啊?有毛用啊?
数据结构:数组、链表、栈、二叉树、哈希表
算法:对结构中数据的处理
算法和数据结构的作用: 现实世界数据存储(家庭地址的存储) 现实世界建模(图) 程序员工具
算法概述:增删查 遍历 排序 递归
专业术语:数据库 记录 字段 关键字(限定词带出记录,记录中包含所有字段,全部记录构成数据库)
过程性语言的问题:
程序与现实世界缺乏对应关系
程序内部结构出现问题,
重视方法,不重视数据,粗糙的数据组织结构,
对象的特征:
对象同时包括方法和字段
类是对象的说明
创建对象,new和类的名称连用
.调用对象的方法
Java数据结构的类库:java.util.*
2.数组
数组又啥好学的呢?
特点:数据项已知 数组的长度固定 非空数据项连续存储、不能有空
插入快(数据项)
查找慢(n/2)
删除慢(n/2查找 n/2移动)
允许重复值条件下的算法、不允许从复制条件下的算法之间的比较
不要太匆忙:算法的缓慢但有条不紊的本质
Java中数组的基础知识:略 数组的索引该由谁负责,调用者又在关注什么?
数据结构的隐藏 各司其职 arr.setEle(k,arr.getEle(ke+1)) 进化到 arr.set(value)
有序数组:
线性查找:找到比自己大的就退出查询
二分查找:二分法查找显著提升速度 log2n对数
查询快、插入慢
算法的比较,大O表示法:O(1) O(logN) O(N) O(N平方)
无序数组插入:常数
线性查询:与N成正比
二分查找:与logN成正比
为什么不使用数组表示一切?数组缺点导致的,慢、固定长度
3.简单排序
计算机不如人类的地方啊?不够智能啊
冒泡排序:冒泡,冒泡,顾名思义啊,怎么一个冒泡法:把最比较出来,放在最边上
算法效率:(n-1)+(n-2)+(n-3)...+1=n*(n-1)/2 O(n2)级别
不变性:out右边的数据项总是有序的
插入排序:部分有序 部分无序
比较次数:概率论的角度。最大:n*(n-1)/2 平均:n*(n-1)/2/2 最小:比冒泡排序减少1半的比较量
不变性:比outer变量下标号小的数据项都是局部有序的
排序规则:compareTo()方法
算法性能比较规则:大O表示法
算法稳定性:具有相同关键字的数据项,经过多次排序,他们的顺序保持不变,这样的排序就是稳定的
不变性:=规律性
4.栈和队列、优先队列。 只有先干完一件事才能干另一件事情
用途不同:数组--数据库 栈队列作为程序员的工具
受限访问:数组--任意访问 栈队列特定时刻只能有一个数据项被操作
更加抽象:可以基于其他数据结构
栈:3*(4+5)很吊 只是一个概念、抽象
精辟:优先级低的项目被压到栈底,等待回来执行
栈的容量:小
栈的实例:reverse、分隔符匹配
效率:O(1)
队列:排队 指针的移动提高效率
循环队列:“缓冲环” 连续序列 折断序列
大量的插入和移除操作的时候,数据项统计影响性能
isFull、isEmpty没有数据项计数字段的队列实现?逻辑啊,大脑啊
效率:O(1)
双端队列:功能繁多=双端队列+栈+队列。
原文地址:http://blog.51cto.com/13496382/2107607