【问题标题】:Deciding between a Priority Queue and Sorting Algorithm在优先队列和排序算法之间做出决定
【发布时间】:2021-01-05 10:39:47
【问题描述】:

我对数据结构和算法比较陌生(高中时从 YouTube 学习),对于我正在从事的项目,我已经走到了思考的十字路口。

我的项目是创建软件来进行测试。我正在考虑按难度对各个问题进行加权,因此在参加考试时,最不难的问题首先显示,最难的问题最后显示(通过最小堆)。这本身就可以工作,而且这样做会很有效。但是,在我的测试程序中,用户可能不想要下一个问题。他们可能想回到一个问题。目前,这可以通过我的 Question 类 (java) 的数组来解决。

Question[] quizQuestions = {question1, question2, question3, ...}

要转到一个问题,程序会获取问题的索引并显示它。 但是,使用优先级队列,我失去了这个功能。 我可以想出几种方法来避免这种情况,例如创建一个数组来存储优先级队列将问题交给用户之后的问题。

但对我来说,这是个问题。使用基于问题难度整数的排序算法来只使用一个数组会更有效吗?知道优先队列的时间复杂度比任何排序算法都快,所以我倾向于队列。但由于对此非常陌生,我想要一些外部意见。在此先感谢。

【问题讨论】:

  • 如果我是你,我会选择排序选项。因为它易于使用,并且有几个优点。如果你想增加一个新的难度级别,你只需要增加那个整数。排序算法完成剩下的工作。
  • “但是,使用优先级队列,我失去了这个功能” --> 单独的优先级队列可以使用数组的索引。因此可以通过优先级索引检索问题。
  • 可以在所有问题都没有回答之前停止练习吗?

标签: algorithm sorting data-structures


【解决方案1】:

这是了解“关注点分离”的好时机。

您绝对希望首先对问题进行排序,将它们作为排序列表提供给测验界面,然后让测验 UI 按提供的顺序询问问题。

这将问题排序的问题与测验用户界面功能的问题区分开来,让您可以独立地维护和修改其中的每一个。如果您想将测验顺序更改为其他内容,您可以这样做而无需担心所有测验 UI 代码,如果您想更改测验 UI,您可以这样做而无需担心问题的排序方式。

【讨论】:

    【解决方案2】:

    Matt 从软件工程的角度回答。从算法上讲,优先级队列的设置时间为 O(n),然后每次弹出 min 元素时为 O(log n)。如果你弹出所有元素,你会得到一个 O(n log n) 时间的排序算法,称为heapsort,它渐近有效,但在实践中往往比你的编程环境提供的任何排序方法慢。老实说,在任何规模合理的测试中,即使是二次时间也可以,所以我只是排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-22
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多