Repository navigation
Expand file tree
/
Copy pathactivity_selection.js
More file actions
156 lines (124 loc) · 3.84 KB
/
Copy pathactivity_selection.js
File metadata and controls
156 lines (124 loc) · 3.84 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
/*
*
* 活动选择问题 - 贪心选择最多不重叠活动
*
* 算法思路:
* - 给定一组活动,每个活动有开始和结束时间
* - 选择最多数量的互不重叠活动
* - 策略:按结束时间排序,贪心选择结束最早的活动
*
* 时间复杂度:O(n log n)(排序)
* 空间复杂度:O(n)(存储结果)
*/
class Activity {
constructor(id, start, end) {
this.id = id;
this.start = start;
this.end = end;
}
toString() {
return `Activity(${this.id}: [${this.start}, ${this.end}])`;
}
}
/*
*
* 选择最多数量的不重叠活动(贪心算法)
* @param {Activity[]} activities - 活动数组
* @returns {Activity[]} 选中的活动数组
*/
function selectActivities(activities) {
if (activities.length === 0) {
return [];
}
// 按结束时间排序
const sorted = [...activities].sort((a, b) => a.end - b.end);
const selected = [sorted[0]];
let lastEndTime = sorted[0].end;
// 贪心选择剩余活动
for (let i = 1; i < sorted.length; i++) {
if (sorted[i].start >= lastEndTime) {
selected.push(sorted[i]);
lastEndTime = sorted[i].end;
}
}
return selected;
}
function testBasicExample() {
console.log("\n[测试1] 基本重叠活动");
const activities = [
new Activity(1, 1, 3),
new Activity(2, 2, 5),
new Activity(3, 4, 6),
new Activity(4, 6, 7),
new Activity(5, 5, 8),
new Activity(6, 8, 9),
];
const selected = selectActivities(activities);
console.log(`Input activities: [${activities.map(String).join(", ")}]`);
console.log(`Selected activities: [${selected.map(String).join(", ")}]`);
console.log(`Count: ${selected.length}`);
}
function testAllCompatible() {
console.log("\n[测试2] 全部活动不重叠");
const activities = [
new Activity(1, 1, 2),
new Activity(2, 2, 3),
new Activity(3, 3, 4),
new Activity(4, 4, 5),
];
const selected = selectActivities(activities);
console.log(`Selected activities: [${selected.map(String).join(", ")}]`);
console.log(`Count: ${selected.length}`);
}
function testAllOverlapping() {
console.log("\n[测试3] 全部活动重叠");
const activities = [
new Activity(1, 1, 10),
new Activity(2, 2, 9),
new Activity(3, 3, 8),
new Activity(4, 4, 7),
];
const selected = selectActivities(activities);
console.log(`Selected activities: [${selected.map(String).join(", ")}]`);
console.log(`Count: ${selected.length}`);
}
function testSingleActivity() {
console.log("\n[测试4] 单个活动");
const activities = [new Activity(1, 5, 10)];
const selected = selectActivities(activities);
console.log(`Selected activities: [${selected.map(String).join(", ")}]`);
console.log(`Count: ${selected.length}`);
}
function testEmpty() {
console.log("\n[测试5] 空输入");
const activities = [];
const selected = selectActivities(activities);
console.log(`Selected activities: [${selected.map(String).join(", ")}]`);
console.log(`Count: ${selected.length}`);
}
function testComplexScheduling() {
console.log("\n[测试6] 复杂调度场景");
const activities = [
new Activity(1, 0, 6),
new Activity(2, 1, 4),
new Activity(3, 3, 5),
new Activity(4, 5, 7),
new Activity(5, 8, 9),
new Activity(6, 5, 9),
];
const selected = selectActivities(activities);
console.log(`Selected activities: [${selected.map(String).join(", ")}]`);
console.log(`Count: ${selected.length}`);
}
if (require.main === module) {
console.log("==================================================");
console.log("活动选择问题 - 贪心算法 (JavaScript)");
console.log("==================================================");
testBasicExample();
testAllCompatible();
testAllOverlapping();
testSingleActivity();
testEmpty();
testComplexScheduling();
}
module.exports = { Activity, selectActivities };