主管交给我一个算法问题,我想了很久也搞不定,
问题是这样的:
用户从系统里下载一个种子短信,由(message_id)标识,下载以后,如果转发给别人,他就可以得到5分的积分,如果这个短信又被接收人转发,他又可以得到2分,不过它只能得到4代的转发积分,也就是说它是一棵树的根,他前3代孩子接收到由它最初转发的短信然后再转发他都可以拿到积分。同时,无论谁接收到此段信,转发后都可以得到5分,同理,如果再被接收人转发,他也可以得到它以下4带给他的积分。
当然,同样的(messge_id)的短信发给同一个人,时间排在前面的那个才算数(send_time)
系统里的种子短信很多,也就是(message_id)很多,同时,用户发的每条转发短信都是一条数据项。数据量非常大(每条短信都有一个status,1代表处理过,0代表为处理),原来的算法是抽取时间大于现在时间-48的所有短信(这些段信才算稳定),把它们的MESSAG_ID 抽出来,每个message_id下都有很多短信,
把所有message_id存在一个队列里,一次抽取一个,然后把这个message_id下的短信全抽出来,由一个线程来处理,最多可以有20个线程,如果已经有20个线程在处理了,下一个message_id就只有等有线程结束了才能开始。线程抽取数据的时候是从数据库里抽取message_id = :message_id,然后按发送时间排序的信息的,现在的问题就是建树的算法确定了,可是在抽取所有message_id和抽取每个message_id下的短信(按时间排好序)时,花的系统时间太大,非常慢,大家有什么好意见啊??