-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstatistics.cpp
More file actions
122 lines (99 loc) · 2.7 KB
/
Copy pathstatistics.cpp
File metadata and controls
122 lines (99 loc) · 2.7 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
#include <iostream>
#include <stdlib.h>
#include "dlist.h"
#include "mtflist.h"
#include "transposelist.h"
#include "slist.h"
#define PATTERN_MAX 10
#define SEQ_MAX 1000
using namespace std;
void initArray(int array[], int size, int randMax) {
for (int i = 0; i < size;) {
int tmp = (randMax == -1) ? rand() : rand() % randMax;
bool hit = false;
for (int j = 0; j < i; j++) {
if (array[j] == tmp) {
hit = true;
break;
}
}
if (hit)
continue;
array[i] = tmp;
i++;
}
}
void printArray(int array[], int size, char arrayName[]) {
for (int i = 0; i < size; i++)
cout << arrayName << "[" << i << "] = " << array[i] << endl;
}
int main(int argc, char* argv[]) {
// verify argument
if (argc != 2) {
cerr << "usage: statistics size" << endl;
return -1;
}
// verify size
int size = atoi(argv[1]);
if (size < PATTERN_MAX) {
cerr << "usage: size >= " << PATTERN_MAX << endl;
return -1;
}
// initialize list items
srand(1);
int *items = new int[size];
initArray(items, size, -1);
printArray(items, size, "items");
// initialize access pattern
int *pattern = new int[PATTERN_MAX];
initArray(pattern, PATTERN_MAX, size);
printArray(pattern, PATTERN_MAX, "pattern");
// initialize pattern frequency
int *frequency = new int[PATTERN_MAX];
for (int i = 1; i < PATTERN_MAX; i++)
frequency[i] = i + frequency[i - 1];
printArray(frequency, PATTERN_MAX, "frequency");
// generate access sequence
int *sequence = new int[SEQ_MAX];
for (int i = 0; i < SEQ_MAX; i++) {
int random = rand() % (frequency[PATTERN_MAX - 1] + 1);
int hit;
for (hit = 0; hit < PATTERN_MAX; hit++) {
if (random <= frequency[hit]) {
break;
}
}
sequence[i] = items[pattern[hit]];
}
printArray(sequence, SEQ_MAX, "sequence");
// now conduct performance evaluation
// doubly linked list
DList<int> dlist;
for (int i = 0; i < size; i++)
dlist.insert(items[i], i);
for (int i = 0; i < SEQ_MAX; i++)
dlist.find(sequence[i]);
cout << "dlist's find cost = " << dlist.getCost() << endl;
// mtf list
MtfList<int> mtflist;
for (int i = 0; i < size; i++)
mtflist.insert(items[i], i);
for (int i = 0; i < SEQ_MAX; i++)
mtflist.find(sequence[i]);
cout << "mtflist's find cost = " << mtflist.getCost() << endl;
// transpose list
TransposeList<int> translist;
for (int i = 0; i < size; i++)
translist.insert(items[i], i);
for (int i = 0; i < SEQ_MAX; i++)
translist.find(sequence[i]);
cout << "translist's find cost = " << translist.getCost() << endl;
// skip list
SList<int> skiplist;
for (int i = 0; i < size; i++)
skiplist.insert(items[i]);
for (int i = 0; i < SEQ_MAX; i++)
skiplist.find(sequence[i]);
cout << "skip's find cost = " << skiplist.getCost() << endl;
return 0;
}