-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstatistics.cpp
More file actions
123 lines (100 loc) · 2.96 KB
/
Copy pathstatistics.cpp
File metadata and controls
123 lines (100 loc) · 2.96 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
123
#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[] ) {
void printArray( int array[], int size, string 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;
}