求一个排序提取的算法 ( 积分: 31 )

  • 主题发起人 主题发起人 bxdwx21
  • 开始时间 开始时间
B

bxdwx21

Unregistered / Unconfirmed
GUEST, unregistred user!
一个文件(大约40M)


文件大概是这个样子,文件里面每一行都是一个网址!
=======================================================
http://delphibbs.com/
http://forum.csdn.net/PointForum/Forum/PostTopic.aspx
http://forum.csdn.net/
....

求:显示文件里面重复最多的10个网址,的算法!!!

速度要快!


结果的格式大概如下:
------------------------------------
重复次数最多的10名
http://delphibbs.com/ 重复1000次
http://forum.XXXX.net/ 重复800次
http://XX.net/ 重复500次
.....


我比较笨,请写具体思路,或代码,谢谢


其实这个就类似“51啦”网页流量统计

就31分了,全部奉上....[:D]
 
文件格式是什么啊?数据库还是文本?
 
你可以把文件导入数据库,然后用一条sql语句统计出来就行了。
 
导入数据库中,使用select...from ... group by ...having试一试 吧
 
使用Hash表来处理,绝对比数据库还来得快!
 
文件格式是TXT的,

还有不能导入到数据库,所以求算法,谢谢
 
To:有畏
怎样使用Hash表来处理?
 
用Hash表是这样的,即建立一个“键值”对应序列。Hash的特点是查询速度快,但是它可是不排序啊。而且插入操作并

不快,因为要计算键。
我的建议:你可先采用边读入边排序字符串,遇到一样的边增加字符传计数的方法,该方法采用简单排序法和折半查找

法,然后采用快速排序法对所有的内容按照计数进行排序。
var
WebStr=record
Str : string;
iCount : integer;
end;
MyTextFile:TextFile;
S:array[0..10000] of WebStr;
strCount:integer;//不同的字符串的个数
strFindedIndex,ilow,ihigh : integer;//在字符串数组中找到字符串的索引
begin
strCount:=0;
assignfile(MyTextFile, 文件名);
reset(MyTextFile);
try
while not eof(MyTextFile) do
begin
readln(MyTextFile,WebStr);//将每行的内容读到WebStr中。
//在WebStr类型S中,对WebStr进行折半查找
ilow:=0;
ihigh:=strCount-1;
while (low<high) do
begin
mstr:=S[(ilow+ihigh) div 2].Str;
if mstr>WebStr then
ihigh:=(ilow+ihigh) div 2-1;
if mstr<WebStr then
ilow:=(ilow+ihigh) div 2+1;
if mstr=WebStr then
strFindedIndex:=(ilow+ihigh) div 2;
end;
if ilow>=ihigh then
//没找到
begin
S[strCount].str:=WebStr;
S[strCount].iCount:=1;
inc(strCount);
将S[strCount]根据WebStr插入到队列中,需要移动元素
end
else
//找到了
begin
inc(S[strFindedIndex].iCount);
end;

end;
finally
closeFile(MyTextFile);
end;
end;

最后当所有的行都读完的话,就可以进行排序了,采用快速排序法应该会得到最好的效果。
当然了,该算法有很多地方可以改进,例如将WebStr插入队列时,不采用移动元素而采用静态表的方法,将会使程序的执行效率有大的提高。
 
TO:xingkong97:

谢谢你,你在思路我看明白了,但是代码一直没有调试过去....
可以帮我在看一下吗。。。
 
怎么没调过去啊?哪里出错了?
 
后退
顶部