字符串hash函數,解決沖突用開放定址法,每次對哈希值加1
在下列程序中,不是按常規方法用哈希表來記錄關鍵字,
而是用整型數組Htable記錄關鍵字在字符串ch中的位置。
在插入時不用把關鍵字復制到哈希表中,只是記錄一個索引,從而提高了效率。
當查詢時,只要把Htable的值映射到字符串ch中就可以了。
注意ch的下標要從1開始,因為Htable中的零值認為是空,處理起來比較方便。
#include<iostream>
#include<string>

using Namespace stdnamespace std;
const int MAXN = 9973; //哈希表長度
const int len = 30; //字符串的最大長度
int Htable[MAX];
char ch[MAX][len]; //存儲關鍵字的字符串
unsigned long Hash(char * key)
{
unsigned long h = 0;
while(*key)
{
h = (h << 4) + *key++;
unsigned long g = h & 0xf0000000L;
if(g)
h ^= g >> 24;
h &= ~g;
}
return h % MAX;
}
int search(char * key)
{
unsigned long i = Hash(key);
while(Htable[i])
{
if(strcmp(ch[Htable[i]], key) == 0)
return i;
i = (i + 1) % MAX;
}
return -1;
}
int insert(char * key, int j) //j為關鍵字在ch中的位置,即索引
{
unsigned long i = Hash(key);
while(Htable[i])
i = (i + 1) % MAX;
Htable[i] = j;
return i;
}
posted @
2007-04-07 16:22 beyonlin 閱讀(5528) |
評論 (3) |
編輯 收藏
在優先隊列中,優先級高的元素先出隊列。
標準庫默認使用元素類型的<操作符來確定它們之間的優先級關系。
優先隊列的第一種用法,也是最常用的用法:
priority_queue<int> qi;
通過<操作符可知在整數中元素大的優先級高。
故示例1中輸出結果為:9 6 5 3 2
第二種方法:
在示例1中,如果我們要把元素從小到大輸出怎么辦呢?
這時我們可以傳入一個比較函數,使用functional.h函數對象作為比較函數。
priority_queue<int, vector<int>, greater<int> >qi2;
其中
第二個參數為容器類型。
第二個參數為比較函數。
故示例2中輸出結果為:2 3 5 6 9
第三種方法:
自定義優先級。
struct node
{
friend bool operator< (node n1, node n2)
{
return n1.priority < n2.priority;
}
int priority;
int value;
};
在該結構中,value為值,priority為優先級。
通過自定義operator<操作符來比較元素中的優先級。
在示例3中輸出結果為:
優先級 值
9 5
8 2
6 1
2 3
1 4
但如果結構定義如下:
struct node
{
friend bool operator> (node n1, node n2)
{
return n1.priority > n2.priority;
}
int priority;
int value;
};
則會編譯不過(G++編譯器)
因為標準庫默認使用元素類型的<操作符來確定它們之間的優先級關系。
而且自定義類型的<操作符與>操作符并無直接聯系,故會編譯不過。
//代碼清單
#include<iostream>
#include<functional>
#include<queue>

using Namespace stdnamespace std;
struct node
{
friend bool operator< (node n1, node n2)
{
return n1.priority < n2.priority;
}
int priority;
int value;
};
int main()
{
const int len = 5;
int i;
int a[len] = {3,5,9,6,2};
//示例1
priority_queue<int> qi;
for(i = 0; i < len; i++)
qi.push(a[i]);
for(i = 0; i < len; i++)
{
cout<<qi.top()<<" ";
qi.pop();
}
cout<<endl;
//示例2
priority_queue<int, vector<int>, greater<int> >qi2;
for(i = 0; i < len; i++)
qi2.push(a[i]);
for(i = 0; i < len; i++)
{
cout<<qi2.top()<<" ";
qi2.pop();
}
cout<<endl;
//示例3
priority_queue<node> qn;
node b[len];
b[0].priority = 6; b[0].value = 1;
b[1].priority = 9; b[1].value = 5;
b[2].priority = 2; b[2].value = 3;
b[3].priority = 8; b[3].value = 2;
b[4].priority = 1; b[4].value = 4;

for(i = 0; i < len; i++)
qn.push(b[i]);
cout<<"優先級"<<'\t'<<"值"<<endl;
for(i = 0; i < len; i++)
{
cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;
qn.pop();
}
return 0;
}

posted @
2007-04-06 02:09 beyonlin 閱讀(57175) |
評論 (4) |
編輯 收藏
k為數組a中最大值,n為數組a的長度。
countSort用于對整型數組排序,時間復雜度為O(k+n)。
當k = O(n)時,時間復雜度變為O(n)。
c[i]記錄a數組中數值大于或等于i的個數
int countSort(int * a, int k, int n)
{
int i;
int * c = new int [k+1], * b = new int [n];
for(i = 0; i <= k; i++)
c[i] = 0;
for(i = 0; i < n; i++)
c[a[i]]++;
for(i = 1; i <= k; i++)
c[i] += c[i-1];
for(i = n - 1; i >= 0; i--)
{
b[c[a[i]]-1] = a[i];
c[a[i]]--;
}
for(i = 0; i < n; i++)
a[i] = b[i];
delete [] b;
delete [] c;
return 0;
}
posted @
2007-04-03 00:57 beyonlin 閱讀(871) |
評論 (0) |
編輯 收藏
學到了一個新的知識點:函數對象。
定義了調用操作符的類,其對象稱為函數對象。
例如
#include<iostream>

using?Namespace?stdnamespace?std;
struct?absInt
{
????int?operator()?(int?v)
????{
????????return?v?>?0???v?:?-v;
????}
};
int?main()
{?
????absInt?obj;
????int?a?=?obj(-15);
????cout<<a<<endl;
????return?0;
}輸出結果為15。
對類absInt的對象obj使用調用操作符就像使用函數一樣。
posted @
2007-03-16 01:29 beyonlin 閱讀(598) |
評論 (0) |
編輯 收藏
template <typename Iter>
void insertSort(Iter *begin, Iter *end)
{
for(Iter *it = begin + 1; it != end; it++)
{
Iter tmp = *it;
Iter *it2 = it - 1;
while(it2 > begin - 1 && *it2 > tmp)
{
*(it2 + 1) = *it2;
it2 --;
}
*(it2 + 1) = tmp;
}
}
posted @
2007-02-06 19:13 beyonlin 閱讀(835) |
評論 (3) |
編輯 收藏