-
Notifications
You must be signed in to change notification settings - Fork 122
/
Copy pathlinearList.js
216 lines (170 loc) · 4.79 KB
/
linearList.js
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
/**
* 线性表
*/
// 线性表的类型定义
// 将所有在数组b中但不在数组a的数据元素插入到a中
var a = [1, 2, 3, 4, 5];
var b = [1, 3, 5, 7, 9];
export function union(a, b) {
var elem, equal;
for (var i = 0, bLen = b.length; i < bLen; i++) {
elem = b[i];
equal = false;
for (var j = 0, aLen = a.length; j < aLen; j++) {
if (elem === a[j]) {
equal = true;
break;
}
}
if (!equal) a.push(elem);
}
}
union(a, b);
console.log(a);
// [1, 2, 3, 4, 5, 7, 9]
// 时间复杂度:O(aLen * bLen)
// 已知数组a和数组b中的数据元素按值非递减排列
// 归并a和b得到新的数组c,c的数据元素也按值非递减排列
var a = [3, 5, 8, 11];
var b = [2, 6, 8, 9, 11, 15, 20];
export function mergeList(a, b) {
var c = [], aElem, bElem;
var i = 0, j = 0, k = 0;
var aLen = a.length;
var bLen = b.length;
while (i < aLen && j < bLen) {
aElem = a[i];
bElem = b[j];
if (aElem < bElem) {
c[k++] = aElem;
i++;
} else {
c[k++] = bElem;
j++;
}
}
while (i < aLen) {
c[k++] = a[i++];
}
while (j < bLen) {
c[k++] = b[j++];
}
return c;
}
var c = mergeList(a, b);
console.log(c);
// [2, 3, 5, 6, 8, 8, 9, 11, 11, 15, 20]
// 时间复杂度: O(aLen + bLen)
// 线性表的顺序表示和实现
// 使用伪数组模拟线性表插入操作的前后数据元素在存储空间中的位置变化
var a = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5};
a.length = 6;
export function insert(a, i, elem) {
if (!elem) return;
var len = a.length;
if (i >= len) {
while (len < i) {
a[len++] = undefined;
a.length++;
}
a[i] = elem;
} else {
while (len > i) {
a[len--] = a[len];
}
a[i] = elem;
}
a.length++;
}
insert(a, 3, 8);
insert(a, 10, 10);
console.log(a);
// 使用伪数组模拟线性表删除操作的前后数据元素在存储空间中的位置变化
export function del(a, i) {
var temp = a[i];
var j = i + 1;
var len = a.length;
while (j < len) {
a[j - 1] = a[j++];
}
a.length--;
delete a[len - 1];
return temp;
}
del(a, 3);
console.log(a);
del(a, 10);
console.log(a);
// 时间复杂度: O(a.length)
// 比较字符表A和B,并用返回值表示结果,值为1,表示A>B,值为-1,表示A<B,值为0,表示A=B
export function listComp(aList, bList) {
for (var i = 0; i < aList.length && i < bList.length; i++) {
if (aList[i] !== bList[i]) return aList[i] > bList[i] ? 1 : -1;
}
if (aList.length == bList.length) return 0;
return aList.length > bList.length ? 1 : -1;
}
export function reverse(list) {
for (var i = 0, j = list.length - 1; i <= j; i++, j--) {
var temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
// 求元素递增排列的线性表A和B的元素的交集并存入C
export function intersect(aList, bList) {
var cList = [];
var i = 0, j = 0, k = 0;
while (aList[i] && bList[j]) {
if (aList[i] < bList[j]) i++;
else if (aList[i] > bList[j]) j++;
else {
cList[k++] = aList[i];
i++;
j++;
}
}
return cList;
}
console.log(intersect([1, 3, 5, 7, 9], [1, 5, 9, 13, 17]) + '');
// 求元素递增排列的线性表A和B的元素的交集并存入回a
export function intersect_true(a, b) {
var i = 0, j = 0, k = 0;
while (a[i] && b[j]) {
if (a[i] < b[j]) i++;
else if (a[i] > b[j]) j++;
else {
a[k++] = a[i];
i++;
j++;
}
}
while (a[k]) a.splice(k, 1);
return a;
}
console.log(intersect_true([1, 3, 5, 7, 9], [1, 5, 9, 13, 17]) + '');
// a,b,c的元素均是非递减排列
// 求a数组中非b数组和c数组的交集的元素。
export function intersect_delete(a, b, c) {
var i = 0, j = 0, k = 0, m = 0;
while (i < a.length && j < b.length && k < c.length) {
if (b[j] < c[k]) j++;
else if (b[j] > c[k]) k++;
else {
// 找到了相同元素same
var same = b[j];
// j,k后移到新的元素
while (b[j] === same) j++;
while (c[k] === same) k++;
// 需保留的元素移动到新位置
while (i < a.length && a[i] < same) a[m++] = a[i++];
// 跳过相同的元素
while (i < a.length && a[i] === same) i++;
}
}
// a的剩余元素重新存储
while (i < a.length) a[m++] = a[i++];
a.length = m;
return a;
}
console.log(intersect_delete([1, 2, 3, 4, 5, 6, 9], [1, 3, 5, 7, 9], [1, 5, 9, 13, 17]) + '');