首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效地保持PHP中的前5位值

有效地保持PHP中的前5位值
EN

Stack Overflow用户
提问于 2009-03-21 11:57:34
回答 8查看 626关注 0票数 1

我正在用PHP编写一个小算法,通过n个有评级的电影,并存储前5。我不是从一个数据文件中读取,而是从一个流中读取,所以我不能简单地按等级排序。

我的问题是,什么是最有效的方式,以保持跟踪前5名的电影,因为我读流?目前我所做的工作如下:

  1. 读入5部电影(放入一个名为movies[]的数组),其中包含两个键--电影和电影
  2. 使用array_multisort()按电影分级对数组进行排序(最高评级现在位于movies4)
  3. 读下一部电影
  4. 如果这个新的电影评级>电影,那么用这个新电影代替电影。
  5. 重新订购名单
  6. 重复3-5,直到完成

我的方法可以工作,但每次读取后需要在列表上排序。我认为这是一种昂贵的方法,主要是因为每次我使用array_multisort()时,我必须在5部电影上做一个for循环,仅仅是为了构建索引来排序。有人能提出更好的方法来解决这个问题吗?

EN

回答 8

Stack Overflow用户

发布于 2009-03-21 12:12:59

链接列表在这里是可行的。

构建一个链接列表,以正确的顺序链接前5部电影。对于每一部新电影,只要从链条的末尾开始,一直走到你的电影在一个评分较高的电影和一个评分较低的电影之间。然后将链接插入到这里的列表中。如果电影比最坏的要好(因此你的名单现在是6长),只要删除链中的最后一个链接,你就会回到5。

没有分类,没有索引。

票数 4
EN

Stack Overflow用户

发布于 2009-03-21 12:02:56

你的算法看起来不错。我不知道这些数组是如何在PHP中实现的。从算法的角度来看:使用堆而不是数组。

票数 3
EN

Stack Overflow用户

发布于 2009-03-21 12:34:47

每次读取后重新排序都没有意义,因为您实际上只需要插入一个新条目。使用下面的算法,它可能会使你获得最佳的速度。它基本上是一个展开循环,不是最漂亮的代码。

代码语言:javascript
复制
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部电影,你可以。最好的办法是再次卷起循环。然而,在某种程度上,对其进行排序将比使用此方法更有效。这种方法只适用于一个小的数据集。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/669181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档