毕业几年了,一直都想写点什么,这么做有几个目的:
1.做总结:希望通过书写将自己学过、做过的东西系统化
2.做备忘:每天要做的事情太多,时间长了,难免遗忘,记录下来就可以随时查看,可以当作自己的一个小工具
3.做分享:工作几年,有一个深深的感触就是有时候自己觉得理解了、掌握了的东西实际上自己并没有真正的理解、掌握,而如果可以向同事、朋友描述一遍,就会发现很多自己没有理解透的东西,一旦能够将这个东西介绍给其他人,那么基本就掌握住了
要写东西总要有个开始,我想大概按照这样一个分类写下去:数据结构&算法,编程语言,网络协议&网络编程,同步互斥,linux以及其它。废话少说,开始吧...
由于CSDN无法上传完整的文件,因此在写博客的同时完成的代码会上传到 http://my.oschina.net/rover 上,代码会尽量通用并附带测试程序。
用计算机解决一个具体的问题,基本上分为以下几个步骤:
1.找到要解决问题的一个适当的数学模型
2.设计一个解此模型的算法
3.编写程序、调试、得到最终的结果
寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间的关系,并用数学语言加以描述。
算法描述的是解决问题的策略,是对问题求解步骤的描述。
编写程序、调试就是最后的实施了。
一、数据结构
1.数据结构的概念
数据结构包含一些术语,以下是最基本的几个术语:
- 数据:能输入到计算机中并被计算机处理的符号的总称
- 数据元素:数据的基本单位,在计算机中通常作为一个整体进行考虑和处理
- 数据结构:相互之间存在一种或多种特定关系的数据元素的集合
- 结构:数据元素之间的关系
根据数据元素之间关系的不同特性,通常有以下4种基本的结构
- 集合:结构之间的元素除了“同属于一个集合”的关系外,没有其它关系
- 线性结构:结构中的数据元素之间存在一个对一个的关系
- 树形结构:数据结构中的元素存在一个对多个的关系
- 图状结构或网状结构:结构中的数据元素之间存在多个对多个的关系
常用的经典的数据结构都对应到一种结构上,而且也都有自己相应的一些经典的算法,因此如果我们在遇到一个新的问题的时候,能够分析出问题中涉及的元素之间的关系,那么我们就可以将自己的候选数据结构缩小到特定的范围,然后我们再根据自己具体的需求分析比较这些候选数据结构及其相关的算法的特性,就可以得到最适合自己的数据结构了。
2.数据结构的存储
数据结构中的结构描述的是数据元素之间的逻辑关系,因此也成为逻辑关系。数据结构在计算机中的表示称为数据的物理结构,又称存储结构。
数据结构在计算机中有两种不同的表示方法:
- 顺序影像:借助数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系,得到的存储结构称为顺序存储结构
- 非顺序影像:借助指示元素存储地址的指针来表示数据元素之间的逻辑关系,得到的存储结构称为链式存储结构
数据结构和存储结构同算法是密切相关的,算法的设计取决于选定的数据结构,算法的实现则依赖于采用的存储结构。
3.数据结构的基本操作
对数据结构的最基本操作包括:添加元素、删除元素、查找元素以及修改元素,这几个操作是最基本的操作也是最常见的操作.。
二、算法
1.算法的特性
- 有穷性:算法应该在执行有穷步后结束(有穷以为着可接受,比如说死循环)
- 确定性:算法中没一条指令都必须有确切的含义,并且算法针对相同的输入应该产生相同的输出
- 可行性:算法中描述的步骤应该是可以通过已经实现的基本操作执行有限次来实现
- 输入、输出:算法有输入和输出
2.算法设计的要求
- 正确性:算法应当满足具体问题的需求
- 可读性:算法应该是易于理解的,因为算法更多的是和人打交道,需要人能够阅读和理解
- 健壮性:应该对异常进行处理而不是产生莫名其妙的结果
- 效率与低存储量要求:就是时间和空间的使用应满足具体问题的要求
3.算法效率的估量
- 事后统计:这种方法要运行程序然后做统计分析,但是依赖于运行的软硬件环境
- 事前分析估计:分析主要语句的执行次数,求和得到多项式f(n)
4. 渐进式
- θ记号:θ(g(n))={ f(n):存在正整数c1,c2和n0,使得所有的n>=n0,有0<=c1 * g(n)<=f(n)<= c2 * g(n)}, θ(g(n))是满足这一性质的函数集合,当n充分大时,f(n)能被c1 * g(n)和c2 * g(n)夹在中间。因此它给出了f(n)的上界和下界。
- Ω记号:Ω(g(n))={ f(n):存在正整数c和n0,使得所有的n>=n0,有0<=c * g(n)<=f(n),Ω(g(n))是满足这一性质的函数集合,当n充分大时,f(n)大于c * g(n)。因此它给出了f(n)的渐进下界。
- O记号:O(g(n))={ f(n):存在正整数c和n0,使得所有的n>=n0,有0<==f(n)<=c * g(n)}, O(g(n))是满足这一性质的函数集合,当n充分大时,f(n)小于c * g(n)。因此它给出了f(n)的渐进上界。
1<loglogn<log n< n ½ < n < nlogn<n2<n3<2n<n!<nn
5.经典的算法
- 分治法:将问题分解为一些独立的子问题,递归地求解各子问题,然后合并子问题的解从而得到原有问题的解
- 动态规划:将问题分解为一些子问题,但是子问题之间不互相独立,各个子问题包含公共的子子问题。动态规划对每个子子问题只求解一次,将其结果保存起来,然后由子子问题的解构造出一个最优解
- 贪心法:将问题分解为一些子问题,但是子问题之间不互相独立,不同于动态规划的是可以通过为每一步选择当前最佳的解从而得到最终问题的一个解