- 学习数据结构的意义:
- 数据结构算是程序员的一个工具箱,对程序中的问题会有很好的解决方案。
- 可以提高自己的编程能力。
- 集合(Set):该结构中的数据元素除了存在“同属于一个集合”的关系外,不存在任何其它关系。 集合与数学的集合类似,有无序性,唯一性,确定性。
- 线性结构(Linear Structure):该结构中的数据元素存在一对一的关系。我们.net程序员做的最多的工作就是对数据库的表操作,二表的最小的数据单元是行。每行数据是最明显的线性结构。
- 树形结构(Tree Structure):该结构中的数据元素存在着一对多的关系。
现实中,家族关系中是最明显的树
- 图状结构(Graphic Structure):该结构中的数据元素存在多对多的关系。
对于我们。net程序员应用的较少,当你用C++作一些底层应用,如搜索引擎,地图导航应用的蛮多的。
- 什么是算法
算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。
- 算法的特性
- 有穷性(Finity):一个算法总是在执行有穷步之后结束,即算法的执行时间是有限的。我们初学.net时候,经常写着死循环,这不是算法,因为这是无穷的。
- 确定性(Unambiguousness):算法的每一个步骤都必须有确切的含义,即无二义,并且对于相同的输入只能有相同的输出。对于我们.net程序员写出二义性的源代码,编译器根本让你通不过。
- 输入(Input):一个算法具有零个或多个输入。它即是在算法开始之前给出的数据结构这些输入是某数据结构中的数据对象。编程是解决问题的,如果不能输入的话,怎么解决问题了。
- 输出(Output):一个算法具有一个或多个输出,并且这些输出与输入之间存在着某种特定的关系。 编程就是解决了生活中问题,你不让用户看到最后的结果,这就失去了编程的意义。
- 能行性(realizability):算法中的每一步都可以通过已经实现的基本运算的有限次运行来实现。这与有穷性息息相关。
- 算法的评价标准
- 运行时间 2、占用空间(有时需要牺牲空间来换取时间,有时需要牺牲时间在换取空间)
- 其他方法:正确性 、 可读性 、 健壮性
评价运行时间就是一个算法时间复杂度, 一个算法的时间复杂度(Time Complexity)是指该算法的运行时间与问题规模的对应关系。
算法中的基本操作一般是指算法中最深层循环内的语句,因此,算法中基本操作语句的频度是问题规模n的某个函数f(n),记作:T(n)=O(f(n))。其中“O”表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,或者说,用“O”符号表示数量级的概念。 这些 都只是一些理论的概念,我们这里用计时器来证明这个理论概念。
①x=n; /*n>1*/
y=0;
while(y < x)
{
y=y+1; ①
}
从理论上分析这是一重循环的程序,while 循环的循环次数为 n,所以,该程序段中语句①的频度是 n,则程序段的时间复杂度是 T(n)=O(n) 。
for(i=1;i<n;++i)
{
for(j=0;j<n;++j)
{
A[i][j]=i*j; ①
}
}
理论上解释为这是二重循环的程序,外层for循环的循环次数是n,内层for循环的循环次数为n,所以,该程序段中语句①的频度为n*n,则程序段的时间复杂度为T(n)=O(n²) 。
③x=n; /*n>1*/
y=0;
while( x >= (y+1)*(y+1) )
{
y=y+1; ①
}
这是一重循环的程序,while 循环的循环次数为 n,所以,该程序段中语句①的频度是 n,则程序段的时间复杂度是 T(n)=O(√n) 。