根据用户输入确定项目列表的优先级(使用尽可能少的比较)

时间:2012-11-27 01:54:51

标签: javascript algorithm

我正在尝试在Javascript中创建一个简单的“人力优先级”程序,我想找到一种根据用户输入对项目列表进行排序的方法。

我认为最好使用制作as few comparisons as possible的算法来实现这一点(这样会向用户提供尽可能少的提示。)

我想按重要性排序以下项目(每个项目的相对重要性由用户决定。):

1) Finish Haxe project

2) Finish Java project

3) Fix car

我想成对地向用户展示这些项目,然后让他们决定哪个项目最重要。哪种排序算法最适合此任务(项目的比较将由用户进行?)

以下是使用用户输入的自动优先级排序器的示例:http://luhman.org/prioritizer-scheduler

更新:我写了一个完全正确的脚本:就是这样。 http://jsfiddle.net/fq3sy/1/

2 个答案:

答案 0 :(得分:1)

JavaScript数组提供sort方法,允许传入回调函数来对非字符串进行自定义排序。如果您可以在这样的回调函数中执行“阻塞”用户输入集合,则可以使用所需的“哪个更重要”问题完全对列表进行排序(可能是window.confirm(),其问题类似于“比B更重要吗?“)。对于漂亮的用户界面而言,这将是丑陋的,但可能是实用的和有效的。

为了避免在执行排序期间发生问答,您至少可以为列表分配一个开始的顺序,执行排序并记录要求的项目对,然后在列表中显示所有这些对。如果更改2个项目中的哪个更重要将触发一个度假胜地,然后用户将被要求仅回答那些新的(并且尚未被询问)的项目。

Tad允许用户拖放以对列表进行排序的想法可能会很好(虽然听起来你想要“更重要的是哪个”流程),尽管我推荐使用jQuery及其{{3} }。

要解决哪种排序算法最好使用,这可能很困难。没有一种算法能够以最少的步数可靠地对列表进行排序,因为所需的步骤数总是取决于项的初始位置。一些排序算法确实更有效,但如果列表开始完全反向排序或以对该算法不利的另一种方式排序,它们仍然可能是昂贵的。无论您使用何种方案,都会存在效率低下的方法。然而,有些人比其他人更好。

要解决此问题,请先查看Sortable plugin。每种类型都有最佳情况,平均情况和最差情况。在popular sorting algorithms中,提问者说他​​的数据具有多次重复的排序键,因此回答者建议使用插入排序,当输入已经排序时,最佳情况会发生。然而,在列表完全相反的情况下,它具有非常差的O(n2)的最坏情况性能。对于任意比较,你可以达到的最好的是O(n log n)。

我确实有一个想法可以减少问题的数量:首先使用一组H M L(高中低)按钮呈现整个项目列表,以便用户为每个项目分配总体优先级。这可以由用户非常快速地完成。完成后,单独对每个列表进行排序。这基本上是进行分发排序,并且将通过巨大量减少“哪个更重要”问题的数量。我的直觉说,对每个10个项目的三个列表进行排序比排序一个30个列表要便宜得多。

您最好的选择可能是合并排序或堆排序。但是你需要自己检查算法。也许你会在一切开始时使用一种排序,然后对于后来的排序使用一种在输入已经按顺序接近时表现最佳的方法。

无论如何,我将列表分成H M L类别的想法应该大大减少任何排序方法的步骤数。

经过一番思考,在我看来,让用户执行相当于插入排序的操作可能是一种合理的方法。要实现它,只需要让用户将新项目放在已经排序的项目中的正确位置,而不是让用户一次比较一个未排序的项目。要求用户选择一个项目开始。它可能是最重要的,最不重要的,或者介于中间的某个地方 - 这无关紧要。然后,显示一个项目的列表(有足够的空间以获得更多),然后一次一个,让他拖动到位(或以其他方式选择)每个未排序项目所属的列表中的位置。完成后,列表将被排序。这样可以提高效率,因为用户不必在每个步骤中一次一个地读取(和比较)列表中的每个项目 - 他会知道他的项目是属于顶部,中间还是底部只需要熟悉它,就可以了解列表中已经组织好的部分。他将能够快速扫描明显的非匹配优先区域,然后将他必须仔细权衡的几个项目归零以确定正确的顺序。在任何时候,如果他改变了对已放置物品顺序的看法,他可以重新安排它们。

作为最后一条评论,我建议你研究一下question you linked in your comment模型,它比“优先级顺序”模型有一些优势。至少,拥有一个可信赖的计算机系统,安排事情并忘记它们以及避免重复相同工作的概念对于任何帮助用户完成工作的系统来说都是非常宝贵的。

答案 1 :(得分:0)

听起来像一个拖累和放大器使用Javascript删除可排序列表 http://tool-man.org/ToolManDHTML/sorting.html

您可以对示例:基本列表进行排序,然后单击右侧的检查按钮以获取当前订单。应该很容易适应你想要的。

注意:我与该网站没有任何关系 - 这只是我在Google上快速找到的第一个网站。