| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2887 人关注过本帖
标题:谁对除留取余法比较熟悉的啊
只看楼主 加入收藏
deleter
Rank: 1
等 级:新手上路
威 望:1
帖 子:858
专家分:0
注 册:2007-7-5
收藏
 问题点数:0 回复次数:10 
谁对除留取余法比较熟悉的啊
可以举个例子告诉我吗

[[it] 本帖最后由 deleter 于 2008-7-30 19:09 编辑 [/it]]
搜索更多相关主题的帖子: 留取 例子 
2008-07-30 19:01
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
是关于哈希表的吗?

2008-07-30 21:38
很远的那颗星
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2008-6-30
收藏
得分:0 
我有代码,要不?

Fighting~~~~~~~~
2008-07-31 10:25
deleter
Rank: 1
等 级:新手上路
威 望:1
帖 子:858
专家分:0
注 册:2007-7-5
收藏
得分:0 
[bo][un]很远的那颗星[/un] 在 2008-7-31 10:25 的发言:[/bo]

我有代码,要不?

好的

物理学家的问题在于他们总是试图用作弊的方法获得结果。
数学家的问题在于他们总是试图获得最幼稚的问题的结果。
软件测试工程师的问题在于他们总是试图用作弊的方法获得最幼稚的问题的结果。
2008-07-31 11:28
deleter
Rank: 1
等 级:新手上路
威 望:1
帖 子:858
专家分:0
注 册:2007-7-5
收藏
得分:0 
[bo][un]blueboy82006[/un] 在 2008-7-30 21:38 的发言:[/bo]

是关于哈希表的吗?

当然是哈希表

物理学家的问题在于他们总是试图用作弊的方法获得结果。
数学家的问题在于他们总是试图获得最幼稚的问题的结果。
软件测试工程师的问题在于他们总是试图用作弊的方法获得最幼稚的问题的结果。
2008-07-31 11:29
elan1986
Rank: 6Rank: 6
等 级:贵宾
威 望:18
帖 子:458
专家分:407
注 册:2007-12-17
收藏
得分:0 
给我一份把!! 谢谢了
2008-07-31 14:44
很远的那颗星
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2008-6-30
收藏
得分:0 
除留余数法(division)
设散列表中允许的地址数为 m ,取一个不大于 m ,但最接近或等于 m 的质数 p 作为除数,用 hash(key) = key % p 把关键码转换成散列地址.

Fighting~~~~~~~~
2008-07-31 16:41
很远的那颗星
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2008-6-30
收藏
得分:0 
代码,以前写的,测试函数被我改了几次,那时我主要也是学习,所以可能对我作用大一点,对大家可能没什么用,就不贴了,下面先贴HashTable.h ,再楼下给出它的实现代码.
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http:// **
*****************************************************************/
#include<iostream>
const int defaultsize = 100;
enum KindOfStatus{ Active,Empty,Deleted};
template<class E,class K>
struct ChainNode
{
   
E data;
    ChainNode<E,K> *link;
};
template<class E,class K>
class HashTable
{
private:
    int divisor;                                   //除数,必须是质数
   
int CurrentSize,TableSize;                 //当前桶数,最大容量(桶的个数)
   
ChainNode<E,K> *ht;                         //散列表存储数组
   
KindOfStatus *info;                         //状态数组
   
ChainNode<E,K> *FindPos(const K k1);     //散列
   
int operator ==(E &e1){ return *this ==e1;}
   
int operator !=(E& e1){ return *this !=e1;}
public:
    HashTable(int d,int sz=defaultsize);
    HashTable<E,K>& operator = (const HashTable<E,K> &ht2);
    bool Search(const K k1,E& e1);
    bool Insert(const E& e1);
    bool Remove(const K k1,E& el);
    void MakeEmpty();
    ~HashTable()
    {
        
delete [ ]ht; delete [ ]info;
    }
}
;


Fighting~~~~~~~~
2008-07-31 16:45
很远的那颗星
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2008-6-30
收藏
得分:0 
二次探查就没写了.

/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http:// **
*****************************************************************/
#include "HashTable.h"
template<class E,class K>
HashTable<E,K>::HashTable(int d,int sz)
{
   
divisor = d;
    TableSize = sz;
    CurrentSize = 0;
    ht = new E[TableSize];
    info = new KindOfStatus[TableSize];
    for (int i=0;i<TableSize;i++)
        info[i] = Empty;
};
//使用线性探查法的搜索法
template<class E,class K>
ChainNode<E,K> *HashTable<E,K>::FindPos(const K k1)
{
   
//搜索关键码为K1的元素
   
int i = k1%divisor;               //计算初始桶号
   
int j = i;                    //j是检测下一空桶下标
   
do
   
{
        
if (info[j] ==Empty ||info[j] ==Active &&ht[j] ==k1) return j;   //找到
        
j = (j+1) % TableSize;
    }
   
while (j != i);
    return j;
}
template<class E,class K>
bool HashTable<E,K>::Search(const K k1,E &e1)
{
   
int i = FindPos(k1);      //搜索
   
if (info[i] != Active || ht[i] != k1) return false;
    e1 = ht[i];
    return true;
}

//清除散列表
template<class E,class K>
void HashTable<E,K>::MakeEmpty()
{
   
for (int i=0;i<TableSize;i++)
        info[i] = Empty;
    CurrentSize = 0;
}

//重载函数,复制一个散列表ht2
template<class E,class K>
HashTable<E,K>& HashTable<E,K>::operator = (const HashTable<E,K>& ht2)
{
   
if(this !=&ht2)
    {
        
delete[ ]ht;  delete [ ]info;
        TableSize = ht2.TableSize;
        ht = new E[TableSize];  info = new KindOfStatus[TableSize];
        for(int i=0;i<TableSize;i++)
        {
            
ht[i] = ht2.ht[i];             //从源散列表向目的散列表传送
            
info[i] = ht2.info[i];
        }
        
CurrentSize = ht2.CurrentSize;        //传送当前元素个数
   
}
   
return *this;                     //返回目标散列表结构指针
};
template<class E,class K>
bool HashTable<E,K>::Insert(const E& e1)
{
   
K k1 = e1;            //重载函数,抽取关键码
   
int i=FindPos(k1);    //计算桶号
   
if (info[i] != Active)  //该桶空,放新元素
   
{
        
ht[i] = e1;  info[i] = Active;
        CurrentSize++;
        return true;
    }
   
if (info[i] ==Active && ht[i] ==e1)
    {
        
std::cout<<"表中已有此元素,不能插入!"<<std::endl;
        return false;
    }
   
std::cout<<"表已满,不能插入!"<<std::endl;
    return false;
}
template<class E,class K>
bool HashTable<E,K>::Remove(const K k1,E &e1)
{
   
int i = FindPos(k1);
    if(info[i] == Active){info[i] =Deleted;  CurrentSize --;   return true;}
   
else return false;
}














Fighting~~~~~~~~
2008-07-31 16:47
wangyinshiwo
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2007-11-9
收藏
得分:0 
/* Note:Your choice is C IDE */
#include "stdio.h"
#define MAX 100
#define NULLKEY -1   /*定义空关键字值*/        
#define DELKEY -2    /*定义被删关键字值*/
typedef int keytype;
typedef struct node
{
    keytype key;
    char data;
    int count;      /*探查次数域*/
}HashTable[MAX];
void insertHT(HashTable ha,int n,keytype k,int p)
{
    int i,adr;
    adr=k%p;
    if(ha[adr].key==NULLKEY || ha[adr].key==DELKEY)
    {
        ha[adr].key=k;
        ha[adr].count=1;
    }
    else
    {
        i=1;
        do
        {
            adr=(adr+1)%p;
            i++;   
        }while(ha[adr].key!=NULLKEY && ha[adr].key!=DELKEY);
        ha[adr].key=k;
        ha[adr].count=i;    /*和冲突数据移动后的位置*/
    }
    n++;
}
void creatHT(HashTable ha,keytype x[],int n,int m,int p)   
{
    int i,n1=0;
    for(i=0;i<m;i++)
    {
        ha[i].key=NULLKEY;
        ha[i].count=0;
    }
    for(i=0;i<n;i++)
    insertHT(ha,n1,x[i],p);
}
int searchHT(HashTable ha,int p,keytype k)
{
    int i,adr;
    adr=k%p;
    while(ha[adr].key!=NULLKEY && ha[adr].key!=k)
    {
        i++;
        adr=(adr+1)%p;
    }
    if(ha[adr].key==k)
    return adr;
    else return -1;
}
int deleteHT(HashTable ha,int p,int k,int n)
{
    int adr;
    adr=searchHT(ha,p,k);
    if(adr!=-1)
    {
        ha[adr].key=DELKEY;
        n--;
        return 1;
    }
    else return 0;
}
void displayHT(HashTable ha,int n,int m)
{
    int i;
    printf("哈希表地址:\t");
    for(i=0;i<m;i++)
    printf("%3d",i);printf("\n");
    printf("哈希表关键字:\t");
    for(i=0;i<m;i++)
    if(ha[i].key==NULLKEY || ha[i].key==DELKEY)
    printf("   ");
    else
    printf("%3d",ha[i].key);printf("\n");
    printf("探查次数:\t");
    for(i=0;i<m;i++)
    if(ha[i].key==NULLKEY ||ha[i].key==DELKEY)
    printf("   ");
    else
    printf("%3d",ha[i].count);
}
void main()
{
    int x[]={16,74,60,43,54,90,46,31,29,88,77};
    int n=11,m=13,p=13,i,k=29;
    HashTable ha;
    creatHT(ha,x,n,m,p);
    printf("\n");displayHT(ha,n,m);
    i=searchHT(ha,p,k);
    if(i!=-1)
    printf("\nha[%d].key=%d\n",i,k);
    else
    printf("\n未找到%d\n",k);
    k=77;
    printf("删除关键字%d\n",k);
    deleteHT(ha,p,k,n);
    displayHT(ha,n,m);
    i=searchHT(ha,p,k);
    if(i!=-1)
    printf("ha[%d].key=%d\n",i,k);
    else
    printf("\n未找到%d\n",k);
    printf("插入关键字%d\n",k);
    insertHT(ha,n,k,p);
    displayHT(ha,n,m);printf("\n");
}

抽刀断水水更流,举杯消愁愁更愁。
2008-08-01 09:49
快速回复:谁对除留取余法比较熟悉的啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030784 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved