【发布时间】:2019-10-23 11:38:57
【问题描述】:
假设我有一些项目,每个项目都有一个序列 - 较小的序列意味着项目在上面。一个项目可以对其他项目具有依赖关系/依赖关系。此外,一个项目可以有可靠的 - 即其他一些项目可能依赖于它。下面的项目列表(我在这里使用了关联的数组)列出了项目 - 每个项目的属性“dep”列出了依赖项和可依赖项。
var dependencyDict = {
item1: {dependsOn: [], dependable: ['item3']},
item2: {dependsOn: [], dependable: []},
item3: {dependsOn: ['item1'], dependable: ['item4']},
item4: {dependsOn: ['item3'], dependable: []}
}
var itemList = {
item1: {
name: 'item1',
seq: 1,
dep: dependencyDict['item1']
},
item2: {
name: 'item2',
seq: 2,
dep: dependencyDict['item2']
},
item3: {
name: 'item3',
seq: 3,
dep: dependencyDict['item3']
},
item4: {
name: 'item4',
seq: 4,
dep: dependencyDict['item4']
}
}
根据上面的说法,项目的先后顺序是这样的:
item1
item2
item3
item4
我的目标是重新排序项目,即更改顺序(如果可能),以使依赖关系完好无损。
验证:只有在依赖关系保持不变的情况下,项目才能移动:即
一个项目只能依赖于它上面的项目,即它们的序列小于项目的序列 反之亦然,即
仅当项目低于项目时,项目才能将项目作为依赖项,即它们的序列大于项目的序列
例如,如果我说 move(item3, 2) - 我要求将 item3 移动到位置 2,以便新项目列表应该是这样的:
{
item1: {
name: 'item1',
seq: 1,
dep: dependencyDict['item1']
},
item2: {
name: 'item2',
seq: 3,
dep: dependencyDict['item2']
},
item3: {
name: 'item3',
seq: 2,
dep: dependencyDict['item3']
},
item4: {
name: 'item4',
seq: 4,
dep: dependencyDict['item4']
}
注意序列的变化
但是如果我说 move(item3, 1),它不会,因为 item3 依赖于 item1 - 如果它移动到位置 1,item1 将转到位置 2,这使 item 只能依赖于 items 的规则无效在它上面。
我的代码处于工作状态,但我使用的 if-else 比正确的算法多
灵活性:itemlist可以放在任何数据结构中,可以使用任何算法
【问题讨论】:
-
above/below 不是适用于对象的术语。
-
你从哪里知道,item3 依赖于item1?
-
"一个项目只能依赖于它之上的项目,即它们的序列小于项目的序列,反之亦然,即项目只有在项目低于该项目时才能依赖于一个项目,即它们的序列是大于项目的序列” - 感觉这两个陈述相互矛盾,你能改写一下吗?
-
"如果我说 move(item3, 12) " - 12 是什么意思?
-
您可能想要的是一个dependency graph 来编码您的项目之间的依赖关系。当您想要移动一个项目时,您可以通过遍历您的有序列表并标记图表中的每个项目来检查生成的订单是否有效,每次检查其所有父项是否已被标记。
标签: javascript arrays algorithm data-structures