@@ -117,12 +117,12 @@ void StopClock() {
117
117
void ShowTimeTaken () {
118
118
std::cout << " \n Time taken: " ;
119
119
std::cout << std::chrono::duration_cast<std::chrono::microseconds>(timerEnd - timerStart).count ();
120
- std::cout << " ms \n " ;
120
+ std::cout << " us \n " ;
121
121
}
122
122
123
123
std::string results = " sample size,pattern size, iteration, time taken\n " ;
124
124
125
- void StoreTimeTaken (size_t sampleSize, size_t patternLength, size_t sampleIteration) {
125
+ void StoreTimeTaken (long long sampleSize, long long patternLength, long long sampleIteration) {
126
126
// sample size out
127
127
std::string output = std::to_string (sampleSize);
128
128
// pattern length out
@@ -153,32 +153,32 @@ void WriteTimeTaken(std::string algo) {
153
153
f.close ();
154
154
}
155
155
156
- std::vector<size_t > Search_BoyerMoore (const std::string& text, const std::string& pattern) {
156
+ std::vector<long long > Search_BoyerMoore (const std::string& text, const std::string& pattern) {
157
157
StartClock ();
158
- size_t textLength = text.length ();
159
- size_t patternLength = pattern.length ();
158
+ long long textLength = text.length ();
159
+ long long patternLength = pattern.length ();
160
160
161
- std::vector<size_t > matchingIndexes;
161
+ std::vector<long long > matchingIndexes;
162
162
163
163
// lookup table to store how many places the given position should skip
164
164
// ascii extended codes
165
- size_t skip[256 ] = {};
165
+ long long skip[256 ] = {};
166
166
167
167
// set all points to be max skip value
168
- for (size_t i = 0 ; i < 256 ; ++i)
168
+ for (long long i = 0 ; i < 256 ; ++i)
169
169
// Not in the pattern.
170
170
skip[i] = patternLength;
171
171
172
172
// for each of the characters in the pattern
173
- for (size_t i = 0 ; i < patternLength; ++i)
173
+ for (long long i = 0 ; i < patternLength; ++i)
174
174
// set that character to its length from the end of the pattern
175
175
skip[pattern[i]] = (patternLength - 1 ) - i;
176
176
177
177
// iterate through all the text, stopping patternLength positions from the end of the text
178
- for (size_t i = 0 ; i < textLength - patternLength; ++i) {
178
+ for (long long i = 0 ; i < textLength - patternLength; ++i) {
179
179
// check if the last character in the pattern is a match
180
- size_t pos = i + patternLength - 1 ;
181
- size_t distance = skip[text[pos]];
180
+ long long pos = i + patternLength - 1 ;
181
+ long long distance = skip[text[pos]];
182
182
183
183
// if no match, skip by distance to the next position
184
184
if (distance != 0 ) {
@@ -188,12 +188,12 @@ std::vector<size_t> Search_BoyerMoore(const std::string& text, const std::string
188
188
189
189
// there is a match
190
190
191
- size_t j;
191
+ long long j;
192
192
193
193
// iterate through the text to check each character
194
194
for (j = 0 ; j < patternLength; j++) {
195
195
// if the current char in text being checked doesn't match that point in the pattern
196
- size_t pos = i + j;
196
+ long long pos = i + j;
197
197
if (text[pos] != pattern[j]) break ; // break and move on
198
198
}
199
199
@@ -216,7 +216,7 @@ bool ShowMatchingIndexes() {
216
216
return true ;
217
217
}
218
218
219
- void ShowMatches (std::vector<size_t > matchingIndexes, std::string& text, std::string& pattern) {
219
+ void ShowMatches (std::vector<long long > matchingIndexes, std::string& text, std::string& pattern) {
220
220
ShowTimeTaken ();
221
221
if (matchingIndexes.empty ()) std::cout << pattern << " is not in the given text!\n " ;
222
222
else {
@@ -228,7 +228,7 @@ void ShowMatches(std::vector<size_t> matchingIndexes, std::string& text, std::st
228
228
229
229
std::string output = " " ;
230
230
231
- for (size_t i = 0 ; i < matchingIndexes.size (); ++i)
231
+ for (long long i = 0 ; i < matchingIndexes.size (); ++i)
232
232
output.append (get_context (text, matchingIndexes[i], (i + 1 )));
233
233
234
234
std::cout << output;
@@ -249,69 +249,68 @@ void BoyerMoore() {
249
249
Clear (MessageType::BoyerMoore);
250
250
std::cout << " Searching for: " << pattern;
251
251
252
- std::vector<size_t > matchingIndexes = Search_BoyerMoore (text, pattern);
252
+ std::vector<long long > matchingIndexes = Search_BoyerMoore (text, pattern);
253
253
ShowMatches (matchingIndexes, text, pattern);
254
254
255
255
EndOfAlgorithm ();
256
256
}
257
257
258
- size_t GetHashValue (size_t patternLength, size_t hashVal, size_t alphabet, size_t prime) {
259
- for (size_t i = 0 ; i < patternLength - 1 ; ++i)
258
+ long long GetHashValue (long long patternLength, long long hashVal, long long alphabet, long long prime) {
259
+ for (long long i = 0 ; i < patternLength - 1 ; ++i)
260
260
hashVal = (hashVal * alphabet) % prime;
261
261
return hashVal;
262
262
}
263
263
264
- size_t HashText (std::string& text, size_t & textHash, size_t patternLength, size_t alphabet, size_t prime) {
265
- size_t val = textHash;
266
- for (size_t i = 0 ; i < patternLength; i++)
267
- val = (alphabet * val + text[i]) % prime;
268
- return val;
264
+ long long HashText (std::string text, long long textHash, long long patternLength, long long alphabet, long long prime) {
265
+ for (long long i = 0 ; i < patternLength; ++i)
266
+ textHash = (alphabet * textHash + text[i]) % prime;
267
+ return textHash;
269
268
}
270
269
271
- size_t RollHash (std::string& text, size_t textHashVal, size_t hashVal, size_t i, size_t patternLength, size_t alphabet, size_t prime) {
270
+ long long RollHash (std::string& text, long long textHashVal, long long hashVal, long long i, long long patternLength, long long alphabet, long long prime) {
272
271
/* Get hash value of the next position
273
272
* Subtract hash value of text[i]
274
273
* Add value of text[i + patlen]
275
274
* Divide total by prime number
276
275
*/
277
276
278
- size_t pos = i + patternLength;
277
+ long long pos = i + patternLength;
279
278
textHashVal = (alphabet * (textHashVal - text[i] * hashVal) + text[pos]) % prime;
280
279
281
280
// if textHash is below 0
282
281
// add prime number to text hash
283
282
284
283
if (textHashVal < 0 )
285
- textHashVal = textHashVal + prime;
284
+ textHashVal += prime;
286
285
287
286
return textHashVal;
288
287
}
289
288
290
- std::vector<size_t > Search_RabinKarp (std::string& text, std::string& pattern) {
289
+ std::vector<long long > Search_RabinKarp (std::string& text, std::string& pattern) {
291
290
StartClock ();
292
291
// vector to hold returnable data
293
- std::vector<size_t > matchingIndexes;
292
+ std::vector<long long > matchingIndexes;
294
293
// Get lengths
295
- size_t patternLength = pattern.size ();
296
- size_t textLength = text.size ();
294
+ long long patternLength = pattern.size ();
295
+ long long textLength = text.size ();
297
296
298
297
// Count of possible chars in input
299
- const size_t alphabet = 256 ;
298
+ const long long alphabet = 256 ;
300
299
// Hash value of the pattern
301
- size_t patternHashVal = 0 ;
300
+ long long patternHashVal = 0 ;
302
301
// Hash value of the text
303
- size_t textHashVal = 0 ;
302
+ long long textHashVal = 0 ;
304
303
// prime number used to calculate hash
305
- const size_t prime = 17 ;
304
+ const long long prime = 17 ;
306
305
307
306
// Calculate the hash value
308
307
// initialise
309
- size_t hashVal = 1 ;
308
+ long long hashVal = 1 ;
310
309
// get hash value
311
310
hashVal = GetHashValue (patternLength, hashVal, alphabet, prime);
312
311
313
312
// Keep iterators in scope
314
- size_t i , j;
313
+ long long i = 0 , j = 0 ;
315
314
316
315
// Get hash values of the pattern and text
317
316
patternHashVal = HashText (pattern, patternHashVal, pattern.size (), alphabet, prime);
@@ -326,7 +325,7 @@ std::vector<size_t> Search_RabinKarp(std::string& text, std::string& pattern) {
326
325
for (j = 0 ; j < patternLength; j++) {
327
326
// check each char
328
327
329
- size_t pos = i + j;
328
+ long long pos = i + j;
330
329
if (text[pos] != pattern[j])
331
330
// break if mismatch
332
331
break ;
@@ -356,7 +355,7 @@ void RabinKarp() {
356
355
Clear (MessageType::RabinKarp);
357
356
std::cout << " Searching for: " << pattern;
358
357
359
- std::vector<size_t > matchingIndexs = Search_RabinKarp (text, pattern);
358
+ std::vector<long long > matchingIndexs = Search_RabinKarp (text, pattern);
360
359
361
360
ShowMatches (matchingIndexs, text, pattern);
362
361
@@ -366,7 +365,7 @@ void RabinKarp() {
366
365
void benchmarkRK () {
367
366
// iterate text sample sizes
368
367
// 2^0 to 2^13 sets of sample text
369
- for (size_t fullLoop = 1 ; fullLoop <= 8192 ; fullLoop *= 2 )
368
+ for (long long fullLoop = 1 ; fullLoop <= 8192 ; fullLoop *= 2 )
370
369
{
371
370
// file to load
372
371
std::string file = " search.txt" ;
@@ -375,7 +374,7 @@ void benchmarkRK() {
375
374
// read once
376
375
load_file (file, text);
377
376
// countdown iterator for loop reading
378
- size_t j = fullLoop;
377
+ long long j = fullLoop;
379
378
// if more than 1 set is to be loaded
380
379
// loop until 1 is reached
381
380
while (j > 1 ) {
@@ -390,35 +389,35 @@ void benchmarkRK() {
390
389
* Large: consectetur
391
390
*/
392
391
std::string patterns[] = { " nec" ," dolor" ," consectetur" };
393
- for (size_t patternLoop = 0 ; patternLoop < 3 ; patternLoop++)
392
+ for (long long patternLoop = 0 ; patternLoop < 3 ; patternLoop++)
394
393
{
395
394
std::string pattern = patterns[patternLoop];
396
- for (size_t algoLoop = 0 ; algoLoop < 100 ; algoLoop++) {
395
+ for (long long algoLoop = 0 ; algoLoop < 100 ; algoLoop++) {
397
396
std::cout << " Sample Size: " << fullLoop << " | Pattern: " << pattern << " | Iteration: " << algoLoop << " | Time taken: " << std::chrono::duration_cast<std::chrono::microseconds>(timerEnd - timerStart).count () << std::endl;
398
397
StartClock ();
399
398
// vector to hold returnable data
400
- std::vector<size_t > matchingIndexes;
399
+ std::vector<long long > matchingIndexes;
401
400
// Get lengths
402
- size_t patternLength = pattern.size ();
403
- size_t textLength = text.size ();
401
+ long long patternLength = pattern.size ();
402
+ long long textLength = text.size ();
404
403
405
404
// Count of possible chars in input
406
- const size_t alphabet = 256 ;
405
+ const long long alphabet = 256 ;
407
406
// Hash value of the pattern
408
- size_t patternHashVal = 0 ;
407
+ long long patternHashVal = 0 ;
409
408
// Hash value of the text
410
- size_t textHashVal = 0 ;
409
+ long long textHashVal = 0 ;
411
410
// prime number used to calculate hash
412
- const size_t prime = 17 ;
411
+ const long long prime = 17 ;
413
412
414
413
// Calculate the hash value
415
414
// initialise
416
- size_t hashVal = 1 ;
415
+ long long hashVal = 1 ;
417
416
// get hash value
418
417
hashVal = GetHashValue (patternLength, hashVal, alphabet, prime);
419
418
420
419
// Keep iterators in scope
421
- size_t i, j;
420
+ long long i, j;
422
421
423
422
// Get hash values of the pattern and text
424
423
patternHashVal = HashText (pattern, patternHashVal, pattern.size (), alphabet, prime);
@@ -433,7 +432,7 @@ void benchmarkRK() {
433
432
for (j = 0 ; j < patternLength; j++) {
434
433
// check each char
435
434
436
- size_t pos = i + j;
435
+ long long pos = i + j;
437
436
if (text[pos] != pattern[j])
438
437
// break if mismatch
439
438
break ;
@@ -461,7 +460,7 @@ void benchmarkRK() {
461
460
void benchmarkBM () {
462
461
// iterate text sample sizes
463
462
// 2^0 to 2^13 sets of sample text
464
- for (size_t fullLoop = 1 ; fullLoop <= 8192 ; fullLoop *= 2 )
463
+ for (long long fullLoop = 1 ; fullLoop <= 8192 ; fullLoop *= 2 )
465
464
{
466
465
// file to load
467
466
std::string file = " search.txt" ;
@@ -470,7 +469,7 @@ void benchmarkBM() {
470
469
// read once
471
470
load_file (file, text);
472
471
// countdown iterator for loop reading
473
- size_t j = fullLoop;
472
+ long long j = fullLoop;
474
473
// if more than 1 set is to be loaded
475
474
// loop until 1 is reached
476
475
while (j > 1 ) {
@@ -485,37 +484,37 @@ void benchmarkBM() {
485
484
* Large: consectetur
486
485
*/
487
486
std::string patterns[] = { " nec" ," dolor" ," consectetur" };
488
- for (size_t patternLoop = 0 ; patternLoop < 3 ; patternLoop++)
487
+ for (long long patternLoop = 0 ; patternLoop < 3 ; patternLoop++)
489
488
{
490
489
std::string pattern = patterns[patternLoop];
491
- for (size_t algoLoop = 0 ; algoLoop < 100 ; algoLoop++)
490
+ for (long long algoLoop = 0 ; algoLoop < 100 ; algoLoop++)
492
491
{
493
492
std::cout << " Sample Size: " << fullLoop << " | Pattern: " << pattern << " | Iteration: " << algoLoop << " | Time taken: " << std::chrono::duration_cast<std::chrono::microseconds>(timerEnd - timerStart).count () << std::endl;
494
493
StartClock ();
495
- size_t textLength = text.length ();
496
- size_t patternLength = pattern.length ();
494
+ long long textLength = text.length ();
495
+ long long patternLength = pattern.length ();
497
496
498
- std::vector<size_t > matchingIndexes;
497
+ std::vector<long long > matchingIndexes;
499
498
500
499
// lookup table to store how many places the given position should skip
501
500
// ascii extended codes
502
- size_t skip[256 ] = {};
501
+ long long skip[256 ] = {};
503
502
504
503
// set all points to be max skip value
505
- for (size_t i = 0 ; i < 256 ; ++i)
504
+ for (long long i = 0 ; i < 256 ; ++i)
506
505
// Not in the pattern.
507
506
skip[i] = patternLength;
508
507
509
508
// for each of the characters in the pattern
510
- for (size_t i = 0 ; i < patternLength; ++i)
509
+ for (long long i = 0 ; i < patternLength; ++i)
511
510
// set that character to its length from the end of the pattern
512
- skip[size_t (pattern[i])] = (patternLength - 1 ) - i;
511
+ skip[long long (pattern[i])] = (patternLength - 1 ) - i;
513
512
514
513
// iterate through all the text, stopping patternLength positions from the end of the text
515
- for (size_t i = 0 ; i < textLength - patternLength; ++i) {
514
+ for (long long i = 0 ; i < textLength - patternLength; ++i) {
516
515
// check if the last character in the pattern is a match
517
- size_t pos = i + patternLength - 1 ;
518
- size_t distance = skip[size_t (text[pos])];
516
+ long long pos = i + patternLength - 1 ;
517
+ long long distance = skip[long long (text[pos])];
519
518
520
519
// if no match, skip by distance to the next position
521
520
if (distance != 0 ) {
@@ -525,12 +524,12 @@ void benchmarkBM() {
525
524
526
525
// there is a match
527
526
528
- size_t j;
527
+ long long j;
529
528
530
529
// iterate through the text to check each character
531
530
for (j = 0 ; j < patternLength; j++) {
532
531
// if the current char in text being checked doesn't match that point in the pattern
533
- size_t pos = i + j;
532
+ long long pos = i + j;
534
533
if (text[pos] != pattern[j]) break ; // break and move on
535
534
}
536
535
0 commit comments