浏览 4349 次
锁定老帖子 主题:找个更加快速的算法。
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-12
所以求一个算法,也就是一个邮件的有序表,前部分是已下载,后半部分是未下载,怎么才能以最快的速度找到第一个未下载邮件位置? 现在的做法是使用的简单的折半查找。从基本的查找方法上来看,应该没有比这个更快的了。 我想知道能不能再向里面添加更加智能化的部分。 因为用户如果有几千封邮件的话,也许也只有最后的10封左右才是新邮件。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-12
不妨设邮件按照时间进行排序,直接在客户端维护两个索引,一个是最新的邮件index,一个是第一个未下载邮件index。在实际操作过程中维护这两个索引。
|
|
返回顶楼 | |
发表时间:2007-05-13
zhangyu8374 写道 不妨设邮件按照时间进行排序,直接在客户端维护两个索引,一个是最新的邮件index,一个是第一个未下载邮件index。在实际操作过程中维护这两个索引。
一开始也是这样想的,不过鉴于邮件头里的时间都不太可靠,所以就改为用pop邮件的UID了。 |
|
返回顶楼 | |
发表时间:2007-05-18
从服务器取回List之后,就有了UID列表,和本地已下载UID比较不就可以了吗?
List uidOnServer; List uidLocal; List getNewMailUids(List uidOnServer, List uidLocal){ //... } 只按日期比较,我觉得是不严谨的,可能以前的邮件也没有读。 如果程序每次都会把检查到的新邮件下载的话,并且如果更新的邮件一定有更高的UID的话(pop3协议决定的,不太了解),那只需要记录程序下载的最新uid就可以了,然后遍历uidOnServer,所有uid大于最新uid的都是新邮件。 |
|
返回顶楼 | |
发表时间:2007-05-21
jasongreen 写道 从服务器取回List之后,就有了UID列表,和本地已下载UID比较不就可以了吗?
List uidOnServer; List uidLocal; List getNewMailUids(List uidOnServer, List uidLocal){ //... } 只按日期比较,我觉得是不严谨的,可能以前的邮件也没有读。 如果程序每次都会把检查到的新邮件下载的话,并且如果更新的邮件一定有更高的UID的话(pop3协议决定的,不太了解),那只需要记录程序下载的最新uid就可以了,然后遍历uidOnServer,所有uid大于最新uid的都是新邮件。 UID只是保证邮件的唯一性,没有大小顺序关系。 邮件还有一个number Id,是按照接受到邮件的时间顺序排列的,但是当你删除中间任何一个邮件时,后面的所有mail的number id 都会向前移一位,所以number id不能作为记录。 我想在查找第一封新邮件方面,折半查找应该是最快的了,我想的是有没有一个比较智能的算法。 比如,跟踪用户每天受到新邮件的情况,动态调整第一次查询的位置。 |
|
返回顶楼 | |
发表时间:2007-05-21
虽然pop rfc里面RETR和DELE命令是无关的,但是偶认识的所有pop服务器,出于存储空间考虑,都是会在用户下载消息以后自动删除的,你用的是啥服务器,会保留已读邮件?
|
|
返回顶楼 | |
发表时间:2007-05-21
weiqingfei 写道 pop邮件在服务器端是无法标记是否下载过,所以要不要下载到客户端,必须有客户端来管理。
我搜索的结果来看,都是说pop3协议无法标记邮件是否已读,不过我用thunderbird收邮件,它都会标成已读。在没收以前,从webmail上看都是未读的,只要一收取就成已读了。 |
|
返回顶楼 | |
发表时间:2007-05-21
Readonly 写道 虽然pop rfc里面RETR和DELE命令是无关的,但是偶认识的所有pop服务器,出于存储空间考虑,都是会在用户下载消息以后自动删除的,你用的是啥服务器,会保留已读邮件?
呵呵,好奇怪,我所知道的所有的pop服务器都不会自动删除用户的消息,除非你设置了要求删除。 pop服务器虽然简单,但是控制起来可要比imap麻烦多了。 |
|
返回顶楼 | |
发表时间:2007-05-21
qiezi 写道 weiqingfei 写道 pop邮件在服务器端是无法标记是否下载过,所以要不要下载到客户端,必须有客户端来管理。
我搜索的结果来看,都是说pop3协议无法标记邮件是否已读,不过我用thunderbird收邮件,它都会标成已读。在没收以前,从webmail上看都是未读的,只要一收取就成已读了。 所有的pop邮件客户端,都会管理已下载邮件的,如果你换一台机子,或者换一个客户端软件,所有的邮件都会重新下载一次。 |
|
返回顶楼 | |
发表时间:2007-05-21
weiqingfei 写道 Readonly 写道 虽然pop rfc里面RETR和DELE命令是无关的,但是偶认识的所有pop服务器,出于存储空间考虑,都是会在用户下载消息以后自动删除的,你用的是啥服务器,会保留已读邮件?
呵呵,好奇怪,我所知道的所有的pop服务器都不会自动删除用户的消息,除非你设置了要求删除。 pop服务器虽然简单,但是控制起来可要比imap麻烦多了。 是偶没有弄清楚,和管邮件服务器的筒子确认了一下:是需要设置的,比如在服务器端设置已读邮件10天内删除,未读邮件180天内删除,还有一些客户端是设置下载完毕以后,立即删除。 去弄个开源的邮件客户端看看它们是怎么处理的把。 |
|
返回顶楼 | |