当为解决某一个问题而且选择数据结构时候,应当执行以下几个步骤:
(1) 分析问题,确定算法遇到的资源限制(内外存空间限制和执行时间的限制)
(2) 确定必须支持的基本运算,度量每个运算所都到的资源限制.基本运算包括向数据结构插入一个新数据项,从数据结构中删除一个数据项和搜索指定的数据项.
(3) 选择最接近这些资源开销的数据结构(分析不同数据结构的比较和算法分析)
◆ 思考在算法的时候先假设条件已经具备,在这样的条件上会有什么情况出现,然后再慢慢补全信息,最后在实现假设的条件
◆ 散列:一个数*奇数有利于均匀分布
◆ 定位最快的方法是散列,树可以转化为散列
◆ 离散型的变量相互间的有无关系可以用并集操作,对于数据量比较大的:线性数组<表链<树<矩阵<散列
算法的定义:
(1) 有输入
(2) 有输出
(3) 确定性
(4) 有穷性
(5) 能行性
算法效率时间测定
#include<time.h>
Long start,stop;
Time(&start);
程序段
Time(&stop)
Runtime=stop-start;
数据的存储结构有以下4种
(1) 顺序存储方法(Sequential storage) 定义:物理和逻辑上的元素都相邻—exp-数组
(2) 索引存储方法(Indexed storage) 除了元素信息还有索引表,索引项的一般形式:(关键码,地址).有稠密和稀疏索引.
(3) 链接存储方法(Linked storage) 定义:元素之间的逻辑关系用附加的指针指示.
(4) 散列存储方法(Hashing storage) 定义:关键码通过一个函数计算直接得到该结点的地址
数据类型分为原子类型(不可分)和结构类型
Assert.h库 的断言机制
程序插入assert(x>0) 如果满足x>0就可继续执行后续语句,否则调用stdlib.h中的abort()打印出错的行号和列号并终止执行.
抽象数据类型的特征是使用与实现分离,实行封装和信息隐蔽,把类型的声明实现分离开来
面向对象=对象+类+继承+消息通信
基类又称父类,超类或泛化类.派生类又称为子类或特化类.
建立对象的结构和为解决问题需要执行的时间序列(场景),据此建立类的继承层次结构.
Union有构造函数和析构函数,所有数据成员共享相同的存储空间(struct的阉割版)
静态声明的变量只有main结束才释放
Endl输出一个换行符并清空流
Printf的效率是cout的2倍
Open()文件操作函数返回文件开始地址
引用传递声明fun(T&);使用引用的的参数只能是对象或者变量
常值引用格式fun(constT& a);函数中不能修改常值函数,const成员函数不能调用非const成员函数
Int sum(int a[],int n)
{
If(n>0)returna[n-1]+sum(a,n-1);
Else return 0;
}
如果传递的是对象要注意构造函数中用new分配了的空间,如果不手工定义复制构造函数,那么当函数结束将会撤销空间, 造成调用者的对象已被撤销(引用传递不存在这种错误)
多态性(polymorphism)是指允许同一个函数(或操作符)有不同的版本,.对于不同的对象执行不同的版本.C++支持以下两种多态性:
(1) 编译时的多态性,表现为函数名(或操作符)的重载exp:C++的 abs(T)
(2) 运行时的多态性,通过派生类和虚函数来实现.
一个类至少有一个纯虚函数,那么该类就是抽象类(abstract class) 不能有实例,派生类必须要实现基类没有实现的所有函数
通常以下3种情况要用到递归
1. 定义是递归的:数列,阶乘等
2. 数据结构是递归的exp:
LinkNode *FindRear(LinkNode *f)
{
If(f==NULL)returnNULL;
Else if(f->link==NULL)return f;
Else return FindRear(f->link);
}
3.问题的解法是递归的:汉诺塔
递归和递推是不同的概念(递推问题可以用递归方法求解,也可以用迭代的方法求解)
求得问题规模为i-1的解后,能从以求得的规模为1,2,…,i-1的一系列的解,构造出问题规模为i的解
尾递归可以直接用迭代直接写出(不用栈保存,因为后面的语句程序直接结束不用保存数据)
一般从递归过程改为非递归过程的方法是先根据递归算法画出程序流程图,然后建立起循环结构
二叉树有序是指有分左右孩子,跟度为2的树不同就在此
Rmq问题的标准解法是O(nlogn)的预处理,O(1)的查询
线段树可以实现O(nlogn)的预处理,O(logn)的查询
左偏树:对于每个内部节点都有shortest(lc(x))>shortest(rc(x));
(a) 最右边从根到外部节点路径是从根到外部结点路径中最短的,其长度就是shortest(x)
(b) N>2^shortest(x) -1(也是至少的内部结点);左偏树的前shortest(x)层不存在外部结点;
多文件中运用全局变量,其中一个文件直接int 其他文件全部用extern int
19<c++沉思录>