字符串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 阅读(5516) |
评论 (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 阅读(57164) |
评论 (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 阅读(864) |
评论 (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 阅读(592) |
评论 (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 阅读(826) |
评论 (3) |
编辑 收藏