我正在用PHP编写一个小算法,通过n个有评级的电影,并存储前5。我不是从一个数据文件中读取,而是从一个流中读取,所以我不能简单地按等级排序。
我的问题是,什么是最有效的方式,以保持跟踪前5名的电影,因为我读流?目前我所做的工作如下:
我的方法可以工作,但每次读取后需要在列表上排序。我认为这是一种昂贵的方法,主要是因为每次我使用array_multisort()时,我必须在5部电影上做一个for循环,仅仅是为了构建索引来排序。有人能提出更好的方法来解决这个问题吗?
发布于 2009-03-21 12:12:59
链接列表在这里是可行的。
构建一个链接列表,以正确的顺序链接前5部电影。对于每一部新电影,只要从链条的末尾开始,一直走到你的电影在一个评分较高的电影和一个评分较低的电影之间。然后将链接插入到这里的列表中。如果电影比最坏的要好(因此你的名单现在是6长),只要删除链中的最后一个链接,你就会回到5。
没有分类,没有索引。
发布于 2009-03-21 12:02:56
你的算法看起来不错。我不知道这些数组是如何在PHP中实现的。从算法的角度来看:使用堆而不是数组。
发布于 2009-03-21 12:34:47
每次读取后重新排序都没有意义,因为您实际上只需要插入一个新条目。使用下面的算法,它可能会使你获得最佳的速度。它基本上是一个展开循环,不是最漂亮的代码。
set movies[0..4].rating to -1.
while more movies in stream:
read in next movie.
if movie.rating < movies[0].rating:
next while
if movie.rating < movies[1].rating:
movies[0] = movie
next while
if movie.rating < movies[2].rating:
movies[0] = movies[1]
movies[1] = movie
next while
if movie.rating < movies[3].rating:
movies[0] = movies[1]
movies[1] = movies[2]
movies[2] = movie
next while
if movie.rating < movies[4].rating:
movies[0] = movies[1]
movies[1] = movies[2]
movies[2] = movies[3]
movies[3] = movie
next while
movies[0] = movies[1]
movies[1] = movies[2]
movies[2] = movies[3]
movies[3] = movies[4]
movies[4] = movie最后,你有你的电影分类列表。如果小于5,那么其他人的评级将是-1,这样你就会知道他们是无效的。这是假设一个真实电影的评分是零或更高,但你可以调整值,如果它们不是。
如果你需要调整它超过5部电影,你可以。最好的办法是再次卷起循环。然而,在某种程度上,对其进行排序将比使用此方法更有效。这种方法只适用于一个小的数据集。
https://stackoverflow.com/questions/669181
复制相似问题