回 帖 发 新 帖 刷新版面

主题:[原创]一道ACM的题目

写一个程序,统计输入中每个单词的出现次数,并按照出现次数的顺序打印单词。在每个单词前打印出现次数
这是一道ACM的题目,应该怎么做 谁可以给个算法!

回复列表 (共10个回复)

沙发

用二叉树对输入的单词进行统计。
每个节点为一个char类型的指针以及一个int变量用来做计数器(用来存储单词出现的次数),指针要开的空间跟据读入的单词长度进行确定。
每次读入一个单词,当它与节点单词相同时,该节点计数器增一,相比更大时递归进入左节点,相比更小时递归进入右节点。

最后对处理输出。

板凳

搞一个链表,读一个单词往链表里相应的地方计数+1,最后给链表排序输出,完毕。

3 楼

我感觉还是用链表比较的直接,好理解

4 楼

此题链表效益较低哦,那个二叉树的还不错,不过还是不够高效,因为例如abc,abcd,abce,比例次数多了,而且极占空间.
建议,设树根为0根.而有二十四个子结点.依次每个根点为a,b,c,d,...
每次只读入一个单词的里一个字母,读一个对应进入一个子节点.若无字母可读时,则该节点计数加一.(这样可避免前面的子串重复比较,且对大数据而言空间量少很多,输出的时侯可用一个数组来保存访问过的节点,'进'则保存,'退'则数组同样退一个字母.)

5 楼

顺便说句,这题可能是为解密用的吧,哈哈,通常解密的才需求单词出现的频率

6 楼

hash比较快,但比较难编。

7 楼

用二分搜索就可以了。简单题!!!

8 楼

有个比较简单的方法:
开个数组a[128];存放128个ACSII码.
读入字串时,直接对相应的a[i], (i为对应字符的ACSII码) 加1, 
最后进行排序就OK了

9 楼

线性规划!

10 楼

这题看数据规模,数据规模不大的时候怎么做都可以的。但是数据规模大的时候,链表的效率显然不行了,平衡二叉树是不错的。另外还有一种直接的方法,读入所有单词,然后排序,这样重复出现的单词会连续出现,然后一次从头到尾的线性扫描统计每个单词的频度,记录下来,再对频度排序后输出就行了。排序算法使用快速排序,时间复杂度为O(nlog n),对于10000000以内的数据规模,这样的方法都应该可以在1秒内解决。

我来回复

您尚未登录,请登录后再回复。点此登录或注册