随笔 - 62  文章 - 96  trackbacks - 0
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(7)

随笔分类(66)

随笔档案(62)

文章分类(31)

文章档案(32)

友情链接

最新随笔

积分与排名

  • 积分 - 231585
  • 排名 - 106

最新评论

阅读排行榜

评论排行榜

字符串hash函数,解决冲突用开放定址法,每次对哈希值加1
在下列程序中,不是按常规方法用哈希表来记录关键字,
而是用整型数组Htable记录关键字在字符串ch中的位置。
在插入时不用把关键字复制到哈希表中,只是记录一个索引,从而提高了效率。
当查询时,只要把Htable的值映射到字符串ch中就可以了。
注意ch的下标要从1开始,因为Htable中的零值认为是空,处理起来比较方便。
#include<iostream>
#include
<string>
using 
namespace 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 阅读(5420) | 评论 (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 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 阅读(57076) | 评论 (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 阅读(836) | 评论 (0)编辑 收藏

学到了一个新的知识点:函数对象。
定义了调用操作符的类,其对象称为函数对象。
例如
#include<iostream>
using 
namespace 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 阅读(578) | 评论 (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 阅读(793) | 评论 (3)编辑 收藏
仅列出标题
共12页: 1 2 3 4 5 6 7 8 9 Last