-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathactivity_selection.go
More file actions
156 lines (122 loc) · 3.34 KB
/
Copy pathactivity_selection.go
File metadata and controls
156 lines (122 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package main
import (
"fmt"
"sort"
)
/*
* 活动选择问题 - 贪心选择最多不重叠活动
*
* 算法思路:
* - 给定一组活动,每个活动有开始和结束时间
* - 选择最多数量的互不重叠活动
* - 策略:按结束时间排序,贪心选择结束最早的活动
*
* 时间复杂度:O(n log n)(排序)
* 空间复杂度:O(n)(存储结果)
*/
type Activity struct {
ID int
Start int
End int
}
// ActivityByEndTime 实现按结束时间排序的接口
type ActivityByEndTime []Activity
func (a ActivityByEndTime) Len() int { return len(a) }
func (a ActivityByEndTime) Less(i, j int) bool { return a[i].End < a[j].End }
func (a ActivityByEndTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
// SelectActivities 选择最多数量的不重叠活动(贪心算法)
func SelectActivities(activities []Activity) []Activity {
if len(activities) == 0 {
return []Activity{}
}
// 按结束时间排序
sort.Sort(ActivityByEndTime(activities))
selected := []Activity{activities[0]}
lastEndTime := activities[0].End
// 贪心选择剩余活动
for i := 1; i < len(activities); i++ {
if activities[i].Start >= lastEndTime {
selected = append(selected, activities[i])
lastEndTime = activities[i].End
}
}
return selected
}
func testBasicExample() {
fmt.Println("\n[测试1] 基本重叠活动")
activities := []Activity{
{1, 1, 3},
{2, 2, 5},
{3, 4, 6},
{4, 6, 7},
{5, 5, 8},
{6, 8, 9},
}
selected := SelectActivities(activities)
fmt.Printf("Input activities: %v\n", activities)
fmt.Printf("Selected activities: %v\n", selected)
fmt.Printf("Count: %d\n", len(selected))
}
func testAllCompatible() {
fmt.Println("\n[测试2] 全部活动不重叠")
activities := []Activity{
{1, 1, 2},
{2, 2, 3},
{3, 3, 4},
{4, 4, 5},
}
selected := SelectActivities(activities)
fmt.Printf("Selected activities: %v\n", selected)
fmt.Printf("Count: %d\n", len(selected))
}
func testAllOverlapping() {
fmt.Println("\n[测试3] 全部活动重叠")
activities := []Activity{
{1, 1, 10},
{2, 2, 9},
{3, 3, 8},
{4, 4, 7},
}
selected := SelectActivities(activities)
fmt.Printf("Selected activities: %v\n", selected)
fmt.Printf("Count: %d\n", len(selected))
}
func testSingleActivity() {
fmt.Println("\n[测试4] 单个活动")
activities := []Activity{{1, 5, 10}}
selected := SelectActivities(activities)
fmt.Printf("Selected activities: %v\n", selected)
fmt.Printf("Count: %d\n", len(selected))
}
func testEmpty() {
fmt.Println("\n[测试5] 空输入")
activities := []Activity{}
selected := SelectActivities(activities)
fmt.Printf("Selected activities: %v\n", selected)
fmt.Printf("Count: %d\n", len(selected))
}
func testComplexScheduling() {
fmt.Println("\n[测试6] 复杂调度场景")
activities := []Activity{
{1, 0, 6},
{2, 1, 4},
{3, 3, 5},
{4, 5, 7},
{5, 8, 9},
{6, 5, 9},
}
selected := SelectActivities(activities)
fmt.Printf("Selected activities: %v\n", selected)
fmt.Printf("Count: %d\n", len(selected))
}
func main() {
fmt.Println("==================================================")
fmt.Println("活动选择问题 - 贪心算法 (Go)")
fmt.Println("==================================================")
testBasicExample()
testAllCompatible()
testAllOverlapping()
testSingleActivity()
testEmpty()
testComplexScheduling()
}