目录
前言
博主在大一学过数据结构(C语言版),现在大四都忘的差不多了,但是当年老师苦口婆心的提醒该课程重要的场景还历历在目。不得不说当年还是太年轻,没有能力去吃透这本内功心法,现在有了一些底子再一次接触就有一种陌生的熟悉感。不管怎样上天再给了我一次机会,让我能够有机会去学习,话不多说,一起来领略数据结构的魅力吧!
概论
算法+数据结构=程序
算法:对数据运算的描述。
数据结构:逻辑结构和存储结构。
程序设计的实质:针对实际问题选择一种好的数据结构和设计一个好的算法。
算法
数据结构
概念性的一些东西,还有一些基本的术语,就不做详述了,主要说一下该部分的重点。
重点
时间复杂度
概述:算法中基本操作重复执行的次数。
记作:T(n) = O(f(n))
举例说明:
//例题1: for(i = 1, i <= n, i++){ for(j = 1, j <= n, j++){ c[i][j] = 0; for(k = 1, k <= n, k++){ c[i][j] = c[i][j] + c[i][j] * b[k][j]; } } } 1.找出基本操作的语句: 语句1:c[i][j] = 0; 语句2:c[i][j] = c[i][j] + c[i][j] * b[k][j]; 2.语句的频度(运算次数): 语句1:n*n = n^2 语句2:n*n*n = n^3 3.取最大: 时间复杂度T(n) = O(n^3)
//例题2: sum = 0; i = 0; while(i <= 100){ sum = sum + i; i++; } 1.找出基本操作的语句: 语句1:sum = sum + i; 语句2:i++; 2.语句的频度(运算次数): 语句1:100 语句2:100 3.取最大: 因为执行的频度是一个常数,与n无关 所以时间复杂度T(n) = O(1)
//例题3: for(i = 1, i <= n, i++){ y = y + 1; for(j = 1, j <= 2*n, j++){ x = x + 1; } } 1.找出基本操作的语句: 语句1:y = y + 1; 语句2:x = x + 1; 2.语句的频度(运算次数): 语句1:n 语句2:n*2n = 2n^2 3.取最大(常数省略): 时间复杂度T(n) = O(n^2)
//例题4: s = 0; while(n >= (s+1)*(s+1)) s = s + 1; 1.找出基本操作的语句: 语句1:s = s + 1; 2.语句的频度(运算次数): 语句转化:(s+1)^2 <= n,即(s+1) <= √n 语句1:√n (根号n) 3.取最大(常数省略): 时间复杂度T(n) = O(√n)