| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6687 人关注过本帖
标题:出个小题 活跃下论坛气氛
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 16楼 BlueGuy
最傻的方法应该就是读的时候跟前边所有的比,如果有了就给那个计数加1。如果没有就续在末尾。
最后只要按顺序输出字串和出现的次数就行了。
这方法应该行吧~ 不过除了最傻的方法,别的我老不知道用什么。也不是没有其它思路,只是不知道怎么改进能进的多一点~
2009-08-25 12:04
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
回复 31楼 pangding
最优的方法肯定就是构造二叉树,毫无疑问.

生命不熄,战斗不止.
2009-08-25 12:30
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
#include <stdio.h>
#include <string.h>

#define N 10010
#define M 10007
struct hashtabel
{
   
    char str[200] ;
    int num;
}a[N], b[N];

int hash(char *s)

{

    int h = 0, a = 127;
   
    for (; *s ; s++)
        
        h = (a*h + *s) % M;
   
    return h;
   
}

int getnum(char *s)
{
    int x;
   
    x = hash(s);
   
    while (strcmp(a[x].str, "") && strcmp(a[x].str, s)) // 该位置有值且值不匹配串
    {
        
        x = (x+1) % M;
        if (!(strcmp(a[x].str, "")))                    // 找一个没有值的位置
        {
            strcpy(a[x].str, s);
            return x;
        }
    }
    return x;
}

int main(void)
{
    char t[200];
    int i, j, n, total;
   
    for (i = 0; i < N; i++)
    {
        strcpy(a[i].str, "");
        a[i].num = 0;
    }
   
    scanf("%d\n", &n);
    for (i = 0, j = 0;  i < n; i++)
    {
        
        gets(t);
        total = getnum(t);
        
        if (a[total].num == 0)
        {
            strcpy(b[j].str, t);
            b[j].num = total;
            j++;
        }
        a[total].num++;
    }
   
    for (i = 0; i < j; i++)
        printf("%s %d\n", b[i].str, a[b[i].num].num);
   
    return 0;
}

我就是真命天子,顺我者生,逆我者死!
2009-08-25 12:53
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
霍纳算法是直接最优线性算法。 基于如下所示的小括号结合法
.....
霍纳算法的应用

引理:......  (mod (解释:取余)函数的算术性质)

在7位ASCII码中, 一个单词可以看作是128进制的数字。对于 'BlueGuy ' 这样的单词所表示的数对计算机来说太大。 无法用普通的算术函数来表达。要计算出字符串的 取模哈希函数。

可以将键分块转换。我们可以利用 mod (解释:取余)函数的算术性质并使用霍纳算法来完成。

 

int hash(char *v, int M)

{

     int h = 0, a = 127;

     for (; *v ; v++)

         h = (a*h + *v) % M;

     return h;

}

 


我就是真命天子,顺我者生,逆我者死!
2009-08-25 12:56
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
这个算法有意思吧  简单强大吧

我就是真命天子,顺我者生,逆我者死!
2009-08-25 12:57
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
有没有个大规模的数据,来测试下性能?

生命不熄,战斗不止.
2009-08-25 12:59
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
<b>没有  不过听说 哈希很强大  呵呵</b>

[ 本帖最后由 BlueGuy 于 2009-8-25 13:14 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2009-08-25 13:04
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 37楼 BlueGuy
我开始也想到用哈希来优化了,不过不太会弄。以前没听过你说的那个算法,正好学学~
2009-08-25 13:27
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 38楼 pangding
哦对,我当时想用哈希的时候,看到SW说特殊数据的问题。我当时想要是用哈希表,肯定能找到一组特殊数据,让很多字串键值相同。这样不是会引起效率骤减?还是说不用考虑这种情况?
2009-08-25 13:33
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 39楼 pangding
任何算法都有适用的范围吧。  

我就是真命天子,顺我者生,逆我者死!
2009-08-25 13:35
快速回复:出个小题 活跃下论坛气氛
数据加载中...
 
   



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

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