8
8
9
9
// 顺序查找
10
10
template <typename T>
11
- auto sequential_search (const std::vector<T> &v , const T &value) -> int
11
+ auto sequential_search (const std::vector<T> &vec , const T &value) -> int
12
12
{
13
- for (int i = 0 ; i < v .size (); ++i) { // 从头到尾遍历
14
- if (v [i] == value) { // 如果找到了,就返回下标
13
+ for (int i = 0 ; i < vec .size (); ++i) { // 从头到尾遍历
14
+ if (vec [i] == value) { // 如果找到了,就返回下标
15
15
return i;
16
16
}
17
17
}
@@ -20,15 +20,15 @@ auto sequential_search(const std::vector<T> &v, const T &value) -> int
20
20
21
21
// 二分查找
22
22
template <typename T>
23
- auto binary_search (const std::vector<T> &v , const T &value) -> int
23
+ auto binary_search (const std::vector<T> &vec , const T &value) -> int
24
24
{
25
25
int low = 0 ; // 最小下标
26
- int high = v .size () - 1 ; // 最大下标
26
+ int high = vec .size () - 1 ; // 最大下标
27
27
while (low <= high) { // 当最小下标小于等于最大下标时
28
28
int mid = (low + high) / 2 ; // 取中间下标
29
- if (v [mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
29
+ if (vec [mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
30
30
return mid;
31
- } else if (v [mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
31
+ } else if (vec [mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
32
32
low = mid + 1 ;
33
33
} else { // 如果中间元素大于要查找的元素,就在左半部分查找
34
34
high = mid - 1 ;
@@ -39,23 +39,23 @@ auto binary_search(const std::vector<T> &v, const T &value) -> int
39
39
40
40
// 斐波那契查找
41
41
template <typename T>
42
- auto fibonacci_search (const std::vector<T> &v , const T &value) -> int
42
+ auto fibonacci_search (const std::vector<T> &vec , const T &value) -> int
43
43
{
44
- std::vector<int > fibonacci{1 , 1 }; // 斐波那契数列
45
- while (fibonacci.back () < v .size ()) { // 生成斐波那契数列
44
+ std::vector<int > fibonacci{1 , 1 }; // 斐波那契数列
45
+ while (fibonacci.back () < vec .size ()) { // 生成斐波那契数列
46
46
fibonacci.push_back (fibonacci[fibonacci.size () - 1 ] + fibonacci[fibonacci.size () - 2 ]);
47
47
}
48
48
int low = 0 ; // 最小下标
49
- int high = v .size () - 1 ; // 最大下标
49
+ int high = vec .size () - 1 ; // 最大下标
50
50
int k = fibonacci.size () - 1 ; // 斐波那契数列的下标
51
51
while (low <= high) { // 当最小下标小于等于最大下标时
52
52
int mid = low + fibonacci[k - 1 ] - 1 ; // 取黄金分割点
53
- if (mid >= v .size ()) { // 如果黄金分割点大于等于数组长度
54
- mid = v .size () - 1 ; // 就将黄金分割点设置为数组最后一个元素的下标
53
+ if (mid >= vec .size ()) { // 如果黄金分割点大于等于数组长度
54
+ mid = vec .size () - 1 ; // 就将黄金分割点设置为数组最后一个元素的下标
55
55
}
56
- if (v [mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
56
+ if (vec [mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
57
57
return mid;
58
- } else if (v [mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
58
+ } else if (vec [mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
59
59
low = mid + 1 ;
60
60
k -= 2 ;
61
61
} else { // 如果中间元素大于要查找的元素,就在左半部分查找
@@ -68,13 +68,13 @@ auto fibonacci_search(const std::vector<T> &v, const T &value) -> int
68
68
69
69
// 线性索引查找
70
70
template <typename T>
71
- auto linear_index_search (const std::vector<T> &v , const T &value) -> int
71
+ auto linear_index_search (const std::vector<T> &vec , const T &value) -> int
72
72
{
73
- std::vector<T> index; // 索引
74
- index.push_back (v [0 ]); // 第一个索引为第一个元素
75
- for (int i = 1 ; i < v .size (); ++i) { // 生成索引
76
- if (v [i] > index.back ()) { // 如果当前元素大于索引的最后一个元素
77
- index.push_back (v [i]);
73
+ std::vector<T> index; // 索引
74
+ index.push_back (vec [0 ]); // 第一个索引为第一个元素
75
+ for (int i = 1 ; i < vec .size (); ++i) { // 生成索引
76
+ if (vec [i] > index.back ()) { // 如果当前元素大于索引的最后一个元素
77
+ index.push_back (vec [i]);
78
78
}
79
79
}
80
80
int low = 0 ; // 最小下标
@@ -94,7 +94,7 @@ auto linear_index_search(const std::vector<T> &v, const T &value) -> int
94
94
95
95
// KMP查找
96
96
template <typename T>
97
- auto kmp_search (const std::vector<T> &v , const std::vector<T> &pattern) -> int
97
+ auto kmp_search (const std::vector<T> &vec , const std::vector<T> &pattern) -> int
98
98
{
99
99
std::vector<int > next (pattern.size ()); // next数组
100
100
next[0 ] = -1 ; // next数组的第一个元素为-1
@@ -109,11 +109,11 @@ auto kmp_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
109
109
next[i] = k; // 将k赋值给next数组的当前元素
110
110
}
111
111
k = -1 ; // next数组的下标
112
- for (int i = 0 ; i < v .size (); ++i) {
113
- while (k > -1 && pattern[k + 1 ] != v [i]) { // 如果k大于-1且下一个元素不等于当前元素
112
+ for (int i = 0 ; i < vec .size (); ++i) {
113
+ while (k > -1 && pattern[k + 1 ] != vec [i]) { // 如果k大于-1且下一个元素不等于当前元素
114
114
k = next[k];
115
115
}
116
- if (pattern[k + 1 ] == v [i]) { // 如果下一个元素等于当前元素
116
+ if (pattern[k + 1 ] == vec [i]) { // 如果下一个元素等于当前元素
117
117
++k;
118
118
}
119
119
if (k == pattern.size () - 1 ) { // 如果k等于模式串的最后一个元素的下标
@@ -139,7 +139,7 @@ auto move_by_suffix(int j, const std::vector<int> &suffix, const std::vector<boo
139
139
}
140
140
// BM查找
141
141
template <typename T>
142
- auto bm_search (const std::vector<T> &v , const std::vector<T> &pattern) -> int
142
+ auto bm_search (const std::vector<T> &vec , const std::vector<T> &pattern) -> int
143
143
{
144
144
std::vector<int > bc (256 , -1 ); // 坏字符哈希表
145
145
for (int i = 0 ; i < pattern.size (); ++i) { // 生成坏字符哈希表
@@ -161,71 +161,71 @@ auto bm_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
161
161
}
162
162
}
163
163
int i = 0 ;
164
- while (i <= v .size () - pattern.size ()) { // 从头到尾遍历
164
+ while (i <= vec .size () - pattern.size ()) { // 从头到尾遍历
165
165
int j = pattern.size () - 1 ;
166
- while (j >= 0 && v [i + j] == pattern[j]) { // 从后往前比较
166
+ while (j >= 0 && vec [i + j] == pattern[j]) { // 从后往前比较
167
167
--j;
168
168
}
169
169
if (j == -1 ) { // 如果模式串的所有元素都匹配了
170
170
return i;
171
171
}
172
- i += std::max (move_by_suffix (j, suffix, prefix), j - bc[v [i + j]]); // 将模式串向后移动
172
+ i += std::max (move_by_suffix (j, suffix, prefix), j - bc[vec [i + j]]); // 将模式串向后移动
173
173
}
174
174
return -1 ; // not found
175
175
}
176
176
177
177
// Sunday查找
178
178
template <typename T>
179
- auto sunday_search (const std::vector<T> &v , const std::vector<T> &pattern) -> int
179
+ auto sunday_search (const std::vector<T> &vec , const std::vector<T> &pattern) -> int
180
180
{
181
181
std::vector<int > bc (256 , -1 ); // 坏字符哈希表
182
182
for (int i = 0 ; i < pattern.size (); ++i) { // 生成坏字符哈希表
183
183
bc[pattern[i]] = i;
184
184
}
185
185
int i = 0 ;
186
- while (i <= v .size () - pattern.size ()) { // 从头到尾遍历
186
+ while (i <= vec .size () - pattern.size ()) { // 从头到尾遍历
187
187
int j = 0 ;
188
- while (j < pattern.size () && v [i + j] == pattern[j]) { // 从前往后比较
188
+ while (j < pattern.size () && vec [i + j] == pattern[j]) { // 从前往后比较
189
189
++j;
190
190
}
191
191
if (j == pattern.size ()) { // 如果模式串的所有元素都匹配了
192
192
return i;
193
193
}
194
- if (i + pattern.size () == v .size ()) { // 如果模式串的最后一个元素在主串中不存在
195
- return -1 ; // not found
194
+ if (i + pattern.size () == vec .size ()) { // 如果模式串的最后一个元素在主串中不存在
195
+ return -1 ; // not found
196
196
}
197
- i += pattern.size () - bc[v [i + pattern.size ()]]; // 将模式串向后移动
197
+ i += pattern.size () - bc[vec [i + pattern.size ()]]; // 将模式串向后移动
198
198
}
199
199
return -1 ; // not found
200
200
}
201
201
202
202
// Rabin-Karp查找
203
203
template <typename T>
204
- auto rabin_karp_search (const std::vector<T> &v , const std::vector<T> &pattern) -> int
204
+ auto rabin_karp_search (const std::vector<T> &vec , const std::vector<T> &pattern) -> int
205
205
{
206
206
int pattern_hash = 0 ; // 模式串的哈希值
207
207
for (int i = 0 ; i < pattern.size (); ++i) {
208
208
pattern_hash += pattern[i];
209
209
}
210
210
int v_hash = 0 ; // 主串的哈希值
211
211
for (int i = 0 ; i < pattern.size (); ++i) {
212
- v_hash += v [i];
212
+ v_hash += vec [i];
213
213
}
214
214
int i = 0 ;
215
- while (i <= v .size () - pattern.size ()) { // 从头到尾遍历
216
- if (v_hash == pattern_hash) { // 如果模式串的哈希值等于主串的哈希值
215
+ while (i <= vec .size () - pattern.size ()) { // 从头到尾遍历
216
+ if (v_hash == pattern_hash) { // 如果模式串的哈希值等于主串的哈希值
217
217
int j = 0 ;
218
- while (j < pattern.size () && v [i + j] == pattern[j]) { // 从前往后比较
218
+ while (j < pattern.size () && vec [i + j] == pattern[j]) { // 从前往后比较
219
219
++j;
220
220
}
221
221
if (j == pattern.size ()) { // 如果模式串的所有元素都匹配了
222
222
return i;
223
223
}
224
224
}
225
- if (i + pattern.size () == v .size ()) { // 如果模式串的最后一个元素在主串中不存在
226
- return -1 ; // not found
225
+ if (i + pattern.size () == vec .size ()) { // 如果模式串的最后一个元素在主串中不存在
226
+ return -1 ; // not found
227
227
}
228
- v_hash += v [i + pattern.size ()] - v [i]; // 将模式串向后移动
228
+ v_hash += vec [i + pattern.size ()] - vec [i]; // 将模式串向后移动
229
229
++i;
230
230
}
231
231
return -1 ; // not found
0 commit comments