为什么要学习数据结构这门课程?
现代的程序设计语言开发包中都有数据结构和常用算法的完整实现,是不是掌握如何使用就可以了?


为什么会有各种各样的程序存在?程序的本质是什么?

如何判断问题求解步骤的好坏?
- /*
- 问题:给定一个整数 n,编程求解 1 + 2 + 3 + ... + n 的和。
- */
- #include <iostream>
-
- using namespace std;
-
- long sum1(int n)
- {
- long ret = 0;
- int* array = new int[n];
-
- for(int i=0; i<n; i++)
- {
- array[i] = i + 1;
- }
-
- for(int i=0; i<n; i++)
- {
- ret += array[i];
- }
-
- delete[] array;
-
- return ret;
- }
-
- long sum2(int n)
- {
- long ret = 0;
-
- for(int i=1; i<=n; i++)
- {
- ret += i;
- }
-
- return ret;
- }
-
- long sum3(int n)
- {
- long ret = 0;
-
- if( n > 0 )
- {
- ret = (1 + n) * n / 2;
- }
-
- return ret;
- }
-
- int main()
- {
- cout << "sum1(100) = " << sum1(100) << endl;
- cout << "sum2(100) = " << sum2(100) << endl;
- cout << "sum3(100) = " << sum3(100) << endl;
-
- return 0;
- }
优秀的开发者追求高质量的代码!
1968年,由高纳德教授(Donald E.Knuth )开创一同年,在计算机科学的学位课程中出现(必修)

程序 = 数据结构+算法
对于数据结构和算法的研究,语言不重要,重要的是思想。
如何用程序描述生活中的个体?

编写一个“好”的程序之前,必须分析待处理问题中各个对象的特性,以及对象之间的关系。





注意:算法可读性是最容易被忽视的,然而,程序是写给人看的,而不是计算机。
如果两个算法都满足功能性需求,那工程中最关心的其它特性是什么?如何比较评判呢?
注意:
性价比(效率)是工程中最关注的算法附加特性!
1. 算法采用的策略和方法
2. 问题的输入规模
3. 编译器所产生的代码
4. 计算机执行速度



- #include <iostream>
-
- using namespace std;
-
- int func(int a[], int len) // ==> (n*n + 2)
- {
- int ret = 0; // 1
-
- for(int i=0; i<len; i++)
- {
- for(int j=0; j<len; j++)
- {
- ret += a[i] * a[j]; // n * n
- }
- }
-
- return ret; // 1
- }
-
- int main()
- {
- int array[] = {1, 2, 3, 4, 5};
-
- cout << func(array, 5) << endl;
-
- return 0;
- }
-




判断一个算法的效率时,操作数量中的常数项和其他次要项常常可以忽略,只需要关注最高阶项就能得出结论。
如何用符号定性的判断算法的效率?
注意!!!
数据结构课程重点关注的是算法的效率问题,因此,整个课程会集中于讨论算法的时间复杂度;
但其使用的方法完全可以用于空间复杂度的判断!






此处子函数少个i++。




意义:
当算法在最坏情况下仍然能满足需求时,可以推断,算法的最好情况和平均情况都满足需求。
注意:
数据结构课程中,在没有特殊说明时,所分析算法的时间复杂度都是指最坏时间复杂度。

- /*
- 问题:
- 在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。
- 设计一个算法,找出出现次数最多的数字。
- */
-
- #include <iostream>
-
- using namespace std;
-
- void search(int a[], int len) // O(n)
- {
- int sp[1000] = {0};
- int max = 0;
-
- for(int i=0; i<len; i++)
- {
- sp[a[i] - 1]++;
- }
-
- for(int i=0; i<1000; i++)
- {
- if( max < sp[i] )
- {
- max = sp[i];
- }
- }
-
- for(int i=0; i<1000; i++)
- {
- if( max == sp[i] )
- {
- cout << i + 1 << endl;
- }
- }
- }
-
- int main(int argc, char* argv[])
- {
- int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};
-
- search(a, sizeof(a)/sizeof(*a));
-
- return 0;
- }
当两个算法的大O表示法相同时,是否意味着两个算法的效率完全相同?
算法时间复杂度相同,意味着两个算法效率是一个级别的,不意味着效率完全相同。
1. 先从概念上形象的理解数据元素之间的关系
2. 思考这种关系能够解决什么问题
3. 考虑基于这种关系能够产生哪些算法
4. 理解和熟悉最终的算法
5. 选择一种熟悉的语言,编码实战
数据结构是计算机领域的基础课程,在学习过程中养成的思维方式将影响整个职业生涯。
