forked from krahets/hello-algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
368 additions
and
16 deletions.
There are no files selected for viewing
127 changes: 127 additions & 0 deletions
127
codes/go/chapter_computational_complexity/time_complexity/time_complexity.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
package time_complexity | ||
|
||
/* 常数阶 */ | ||
func constant(n int) int { | ||
count := 0 | ||
size := 100000 | ||
for i := 0; i < size; i++ { | ||
count++ | ||
} | ||
return count | ||
} | ||
|
||
/* 线性阶 */ | ||
func linear(n int) int { | ||
count := 0 | ||
for i := 0; i < n; i++ { | ||
count++ | ||
} | ||
return count | ||
} | ||
|
||
/* 线性阶(遍历数组) */ | ||
func arrayTraversal(nums []int) int { | ||
count := 0 | ||
// 循环次数与数组长度成正比 | ||
for range nums { | ||
count++ | ||
} | ||
return count | ||
} | ||
|
||
/* 平方阶 */ | ||
func quadratic(n int) int { | ||
count := 0 | ||
// 循环次数与数组长度成平方关系 | ||
for i := 0; i < n; i++ { | ||
for j := 0; j < n; j++ { | ||
count++ | ||
} | ||
} | ||
return count | ||
} | ||
|
||
/* 平方阶(冒泡排序) */ | ||
func bubbleSort(nums []int) int { | ||
count := 0 // 计数器 | ||
// 外循环:待排序元素数量为 n-1, n-2, ..., 1 | ||
for i := len(nums) - 1; i > 0; i-- { | ||
// 内循环:冒泡操作 | ||
for j := 0; j < i; j++ { | ||
if nums[j] > nums[j+1] { | ||
// 交换 nums[j] 与 nums[j + 1] | ||
tmp := nums[j] | ||
nums[j] = nums[j+1] | ||
nums[j+1] = tmp | ||
count += 3 // 元素交换包含 3 个单元操作 | ||
} | ||
} | ||
} | ||
return count | ||
} | ||
|
||
/* 指数阶(循环实现)*/ | ||
func exponential(n int) int { | ||
count, base := 0, 1 | ||
// cell 每轮一分为二,形成数列 1, 2, 4, 8, ..., 2^(n-1) | ||
for i := 0; i < n; i++ { | ||
for j := 0; j < base; j++ { | ||
count++ | ||
} | ||
base *= 2 | ||
} | ||
// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 | ||
return count | ||
} | ||
|
||
/* 指数阶(递归实现)*/ | ||
func expRecur(n int) int { | ||
if n == 1 { | ||
return 1 | ||
} | ||
return expRecur(n-1) + expRecur(n-1) + 1 | ||
} | ||
|
||
/* 对数阶(循环实现)*/ | ||
func logarithmic(n float64) int { | ||
count := 0 | ||
for n > 1 { | ||
n = n / 2 | ||
count++ | ||
} | ||
return count | ||
} | ||
|
||
/* 对数阶(递归实现)*/ | ||
func logRecur(n float64) int { | ||
if n <= 1 { | ||
return 0 | ||
} | ||
return logRecur(n/2) + 1 | ||
} | ||
|
||
/* 线性对数阶 */ | ||
func linearLogRecur(n float64) int { | ||
if n <= 1 { | ||
return 1 | ||
} | ||
count := linearLogRecur(n/2) + | ||
linearLogRecur(n/2) | ||
for i := 0.0; i < n; i++ { | ||
count++ | ||
} | ||
return count | ||
} | ||
|
||
/* 阶乘阶(递归实现) */ | ||
func factorialRecur(n int) int { | ||
if n == 0 { | ||
return 1 | ||
} | ||
count := 0 | ||
// 从 1 个分裂出 n 个 | ||
for i := 0; i < n; i++ { | ||
count += factorialRecur(n - 1) | ||
} | ||
return count | ||
} |
44 changes: 44 additions & 0 deletions
44
codes/go/chapter_computational_complexity/time_complexity/time_complexity_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
package time_complexity | ||
|
||
import ( | ||
"fmt" | ||
"testing" | ||
) | ||
|
||
func TestTimeComplexity(t *testing.T) { | ||
n := 8 | ||
fmt.Println("输入数据大小 n =", n) | ||
|
||
count := constant(n) | ||
fmt.Println("常数阶的计算操作数量 =", count) | ||
|
||
count = linear(n) | ||
fmt.Println("线性阶的计算操作数量 =", count) | ||
count = arrayTraversal(make([]int, n)) | ||
fmt.Println("线性阶(遍历数组)的计算操作数量 =", count) | ||
|
||
count = quadratic(n) | ||
fmt.Println("平方阶的计算操作数量 =", count) | ||
nums := make([]int, n) | ||
for i := 0; i < n; i++ { | ||
nums[i] = n - i | ||
} | ||
count = bubbleSort(nums) | ||
fmt.Println("平方阶(冒泡排序)的计算操作数量 =", count) | ||
|
||
count = exponential(n) | ||
fmt.Println("指数阶(循环实现)的计算操作数量 =", count) | ||
count = expRecur(n) | ||
fmt.Println("指数阶(递归实现)的计算操作数量 =", count) | ||
|
||
count = logarithmic(float64(n)) | ||
fmt.Println("对数阶(循环实现)的计算操作数量 =", count) | ||
count = logRecur(float64(n)) | ||
fmt.Println("对数阶(递归实现)的计算操作数量 =", count) | ||
|
||
count = linearLogRecur(float64(n)) | ||
fmt.Println("线性对数阶(递归实现)的计算操作数量 =", count) | ||
|
||
count = factorialRecur(n) | ||
fmt.Println("阶乘阶(递归实现)的计算操作数量 =", count) | ||
} |
Oops, something went wrong.