88
99// 顺序查找
1010template <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
1212{
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) { // 如果找到了,就返回下标
1515 return i;
1616 }
1717 }
@@ -20,15 +20,15 @@ auto sequential_search(const std::vector<T> &v, const T &value) -> int
2020
2121// 二分查找
2222template <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
2424{
2525 int low = 0 ; // 最小下标
26- int high = v .size () - 1 ; // 最大下标
26+ int high = vec .size () - 1 ; // 最大下标
2727 while (low <= high) { // 当最小下标小于等于最大下标时
2828 int mid = (low + high) / 2 ; // 取中间下标
29- if (v [mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
29+ if (vec [mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
3030 return mid;
31- } else if (v [mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
31+ } else if (vec [mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
3232 low = mid + 1 ;
3333 } else { // 如果中间元素大于要查找的元素,就在左半部分查找
3434 high = mid - 1 ;
@@ -39,23 +39,23 @@ auto binary_search(const std::vector<T> &v, const T &value) -> int
3939
4040// 斐波那契查找
4141template <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
4343{
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 ()) { // 生成斐波那契数列
4646 fibonacci.push_back (fibonacci[fibonacci.size () - 1 ] + fibonacci[fibonacci.size () - 2 ]);
4747 }
4848 int low = 0 ; // 最小下标
49- int high = v .size () - 1 ; // 最大下标
49+ int high = vec .size () - 1 ; // 最大下标
5050 int k = fibonacci.size () - 1 ; // 斐波那契数列的下标
5151 while (low <= high) { // 当最小下标小于等于最大下标时
5252 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 ; // 就将黄金分割点设置为数组最后一个元素的下标
5555 }
56- if (v [mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
56+ if (vec [mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
5757 return mid;
58- } else if (v [mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
58+ } else if (vec [mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
5959 low = mid + 1 ;
6060 k -= 2 ;
6161 } else { // 如果中间元素大于要查找的元素,就在左半部分查找
@@ -68,13 +68,13 @@ auto fibonacci_search(const std::vector<T> &v, const T &value) -> int
6868
6969// 线性索引查找
7070template <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
7272{
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]);
7878 }
7979 }
8080 int low = 0 ; // 最小下标
@@ -94,7 +94,7 @@ auto linear_index_search(const std::vector<T> &v, const T &value) -> int
9494
9595// KMP查找
9696template <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
9898{
9999 std::vector<int > next (pattern.size ()); // next数组
100100 next[0 ] = -1 ; // next数组的第一个元素为-1
@@ -109,11 +109,11 @@ auto kmp_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
109109 next[i] = k; // 将k赋值给next数组的当前元素
110110 }
111111 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且下一个元素不等于当前元素
114114 k = next[k];
115115 }
116- if (pattern[k + 1 ] == v [i]) { // 如果下一个元素等于当前元素
116+ if (pattern[k + 1 ] == vec [i]) { // 如果下一个元素等于当前元素
117117 ++k;
118118 }
119119 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
139139}
140140// BM查找
141141template <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
143143{
144144 std::vector<int > bc (256 , -1 ); // 坏字符哈希表
145145 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
161161 }
162162 }
163163 int i = 0 ;
164- while (i <= v .size () - pattern.size ()) { // 从头到尾遍历
164+ while (i <= vec .size () - pattern.size ()) { // 从头到尾遍历
165165 int j = pattern.size () - 1 ;
166- while (j >= 0 && v [i + j] == pattern[j]) { // 从后往前比较
166+ while (j >= 0 && vec [i + j] == pattern[j]) { // 从后往前比较
167167 --j;
168168 }
169169 if (j == -1 ) { // 如果模式串的所有元素都匹配了
170170 return i;
171171 }
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]]); // 将模式串向后移动
173173 }
174174 return -1 ; // not found
175175}
176176
177177// Sunday查找
178178template <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
180180{
181181 std::vector<int > bc (256 , -1 ); // 坏字符哈希表
182182 for (int i = 0 ; i < pattern.size (); ++i) { // 生成坏字符哈希表
183183 bc[pattern[i]] = i;
184184 }
185185 int i = 0 ;
186- while (i <= v .size () - pattern.size ()) { // 从头到尾遍历
186+ while (i <= vec .size () - pattern.size ()) { // 从头到尾遍历
187187 int j = 0 ;
188- while (j < pattern.size () && v [i + j] == pattern[j]) { // 从前往后比较
188+ while (j < pattern.size () && vec [i + j] == pattern[j]) { // 从前往后比较
189189 ++j;
190190 }
191191 if (j == pattern.size ()) { // 如果模式串的所有元素都匹配了
192192 return i;
193193 }
194- if (i + pattern.size () == v .size ()) { // 如果模式串的最后一个元素在主串中不存在
195- return -1 ; // not found
194+ if (i + pattern.size () == vec .size ()) { // 如果模式串的最后一个元素在主串中不存在
195+ return -1 ; // not found
196196 }
197- i += pattern.size () - bc[v [i + pattern.size ()]]; // 将模式串向后移动
197+ i += pattern.size () - bc[vec [i + pattern.size ()]]; // 将模式串向后移动
198198 }
199199 return -1 ; // not found
200200}
201201
202202// Rabin-Karp查找
203203template <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
205205{
206206 int pattern_hash = 0 ; // 模式串的哈希值
207207 for (int i = 0 ; i < pattern.size (); ++i) {
208208 pattern_hash += pattern[i];
209209 }
210210 int v_hash = 0 ; // 主串的哈希值
211211 for (int i = 0 ; i < pattern.size (); ++i) {
212- v_hash += v [i];
212+ v_hash += vec [i];
213213 }
214214 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) { // 如果模式串的哈希值等于主串的哈希值
217217 int j = 0 ;
218- while (j < pattern.size () && v [i + j] == pattern[j]) { // 从前往后比较
218+ while (j < pattern.size () && vec [i + j] == pattern[j]) { // 从前往后比较
219219 ++j;
220220 }
221221 if (j == pattern.size ()) { // 如果模式串的所有元素都匹配了
222222 return i;
223223 }
224224 }
225- if (i + pattern.size () == v .size ()) { // 如果模式串的最后一个元素在主串中不存在
226- return -1 ; // not found
225+ if (i + pattern.size () == vec .size ()) { // 如果模式串的最后一个元素在主串中不存在
226+ return -1 ; // not found
227227 }
228- v_hash += v [i + pattern.size ()] - v [i]; // 将模式串向后移动
228+ v_hash += vec [i + pattern.size ()] - vec [i]; // 将模式串向后移动
229229 ++i;
230230 }
231231 return -1 ; // not found
0 commit comments