论坛首页 综合技术论坛

找个更加快速的算法。

浏览 4349 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-12  
pop邮件在服务器端是无法标记是否下载过,所以要不要下载到客户端,必须有客户端来管理。

所以求一个算法,也就是一个邮件的有序表,前部分是已下载,后半部分是未下载,怎么才能以最快的速度找到第一个未下载邮件位置?

现在的做法是使用的简单的折半查找。从基本的查找方法上来看,应该没有比这个更快的了。

我想知道能不能再向里面添加更加智能化的部分。
因为用户如果有几千封邮件的话,也许也只有最后的10封左右才是新邮件。
   发表时间:2007-05-12  
不妨设邮件按照时间进行排序,直接在客户端维护两个索引,一个是最新的邮件index,一个是第一个未下载邮件index。在实际操作过程中维护这两个索引。
0 请登录后投票
   发表时间:2007-05-13  
zhangyu8374 写道
不妨设邮件按照时间进行排序,直接在客户端维护两个索引,一个是最新的邮件index,一个是第一个未下载邮件index。在实际操作过程中维护这两个索引。


一开始也是这样想的,不过鉴于邮件头里的时间都不太可靠,所以就改为用pop邮件的UID了。
0 请登录后投票
   发表时间:2007-05-18  
从服务器取回List之后,就有了UID列表,和本地已下载UID比较不就可以了吗?
List uidOnServer;
List uidLocal;

List getNewMailUids(List uidOnServer, List uidLocal){
  //...
}


只按日期比较,我觉得是不严谨的,可能以前的邮件也没有读。

如果程序每次都会把检查到的新邮件下载的话,并且如果更新的邮件一定有更高的UID的话(pop3协议决定的,不太了解),那只需要记录程序下载的最新uid就可以了,然后遍历uidOnServer,所有uid大于最新uid的都是新邮件。
0 请登录后投票
   发表时间: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不能作为记录。

我想在查找第一封新邮件方面,折半查找应该是最快的了,我想的是有没有一个比较智能的算法。

比如,跟踪用户每天受到新邮件的情况,动态调整第一次查询的位置。
0 请登录后投票
   发表时间:2007-05-21  
虽然pop rfc里面RETR和DELE命令是无关的,但是偶认识的所有pop服务器,出于存储空间考虑,都是会在用户下载消息以后自动删除的,你用的是啥服务器,会保留已读邮件?
0 请登录后投票
   发表时间:2007-05-21  
weiqingfei 写道
pop邮件在服务器端是无法标记是否下载过,所以要不要下载到客户端,必须有客户端来管理。

我搜索的结果来看,都是说pop3协议无法标记邮件是否已读,不过我用thunderbird收邮件,它都会标成已读。在没收以前,从webmail上看都是未读的,只要一收取就成已读了。
0 请登录后投票
   发表时间:2007-05-21  
Readonly 写道
虽然pop rfc里面RETR和DELE命令是无关的,但是偶认识的所有pop服务器,出于存储空间考虑,都是会在用户下载消息以后自动删除的,你用的是啥服务器,会保留已读邮件?


呵呵,好奇怪,我所知道的所有的pop服务器都不会自动删除用户的消息,除非你设置了要求删除。

pop服务器虽然简单,但是控制起来可要比imap麻烦多了。
0 请登录后投票
   发表时间:2007-05-21  
qiezi 写道
weiqingfei 写道
pop邮件在服务器端是无法标记是否下载过,所以要不要下载到客户端,必须有客户端来管理。

我搜索的结果来看,都是说pop3协议无法标记邮件是否已读,不过我用thunderbird收邮件,它都会标成已读。在没收以前,从webmail上看都是未读的,只要一收取就成已读了。


所有的pop邮件客户端,都会管理已下载邮件的,如果你换一台机子,或者换一个客户端软件,所有的邮件都会重新下载一次。
0 请登录后投票
   发表时间:2007-05-21  
weiqingfei 写道
Readonly 写道
虽然pop rfc里面RETR和DELE命令是无关的,但是偶认识的所有pop服务器,出于存储空间考虑,都是会在用户下载消息以后自动删除的,你用的是啥服务器,会保留已读邮件?


呵呵,好奇怪,我所知道的所有的pop服务器都不会自动删除用户的消息,除非你设置了要求删除。

pop服务器虽然简单,但是控制起来可要比imap麻烦多了。

是偶没有弄清楚,和管邮件服务器的筒子确认了一下:是需要设置的,比如在服务器端设置已读邮件10天内删除,未读邮件180天内删除,还有一些客户端是设置下载完毕以后,立即删除。

去弄个开源的邮件客户端看看它们是怎么处理的把。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics