【发布时间】:2014-01-28 22:00:22
【问题描述】:
如何从一组项目中形成一个扁平的有序列表,每个项目都可能要求它们出现在列表中的其他项目之前和/或之后?
Sample input
-----------------------
3: before 5 and after 2
8: before 5
2: before 3
5: no constraint
Sample output
-------------
[2, 3, 8, 5]
显然,这类问题的一般解决方案是非唯一的(考虑许多没有约束的元素的情况),这很好 - 任何满足约束的结果都可以。
我也知道这里有很多错误情况(重复元素,两个元素都想在彼此之前,等等......)。现在我对“快乐路径”感兴趣——稍后我会添加错误处理。
这里有几个 Python 测试用例。它们远非全面,但应该足以让您了解:
def test_some_unconstrained_elements():
l = ListBuilder()
l.add(1, after=None, before=None)
l.add(7, after=None, before=None)
assert set(l.to_list()) == {1, 7}
def test_element_which_should_appear_after_already_added_element():
l = ListBuilder()
l.add(5, after=None, before=None)
l.add(3, after=5, before=None)
assert l.to_list() == [5, 3]
def test_element_which_should_appear_after_element_added_later():
l = ListBuilder()
l.add(3, after=5, before=None)
l.add(5, after=None, before=None)
assert l.to_list() == [5, 3]
def test_element_which_should_appear_between_two_already_added_elements():
l = ListBuilder()
l.add(4, after=None, before=None)
l.add(2, after=None, before=None)
l.add(6, after=2, before=4)
assert l.to_list() == [2, 6, 4]
def test_two_elements_either_side_of_new_element():
l = ListBuilder()
l.add(4, after=6, before=None)
l.add(2, after=None, before=6)
l.add(6, after=None, before=None)
assert l.to_list() == [2, 6, 4]
def test_element_which_should_appear_after_missing_element():
l = ListBuilder()
l.add(4, after=6, before=None)
assert l.to_list() == [4]
def test_two_elements_which_should_appear_after_the_same_element():
l = ListBuilder()
l.add(4, after=None, before=None)
l.add(6, after=4, before=None)
l.add(8, after=4, before=None)
assert l[0] == 4
assert set(l[1:]) == {6, 8}
def test_fully_constrained_short_list():
l = ListBuilder()
l.add(3, after=4, before=None)
l.add(4, after=5, before=3)
l.add(5, after=None, before=4)
assert l.to_list() == [5, 4, 3]
注意。 这不是家庭作业。这是我在现实生活中需要解决的一个实际问题(我正在研究a test framework;我很乐意详细说明我需要它做什么),但我不够聪明:(
【问题讨论】:
-
2: before 3 | 8正确吗? -
到目前为止,除了测试用例之外,您还做了什么?
-
@rendon 抱歉,我认为我的示例输入/输出表的格式有点误导。我会改的。
-
您在示例中使用了数字。对列表进行排序不是一种选择吗?
-
这似乎是一种拓扑排序。这种排序通常用于项目计划中以安排活动。我说的对吗?