有n个软件包,编号从1到n。成对的K对(i,j)定义了一系列依赖关系,因此,如果不安装软件包i,就无法安装软件包j。
使用线性时间算法来处理,该算法采用列表K,并生成安装软件包1所需的所有软件包的列表。
这是我的尝试:
function algortihm(n,K)
radix sort K(i,j) on key j
dependencies <- arr size n //declare array
currPackage <- 1
tempArr <- K
function func(currPackage, K)
dependencies.append(currPackage)
count <- -1
for (i,j) in K:
if j not in dependencies:
count <- count + 1
if j == currPackage:
tempArr.remove(count)
func(i, tempArr)
endif
endif
if j > currPackage:
break
endif
endfor
endfunction
return dependencies
endfunction
使用此输入K =(1,2)(3,2)(3,4)(4,1)(5,1)(5,4)(6,8)(8,3)(7 ,6)
基数排序具有O(n)的复杂度,并且会减少迭代列表的次数,因为如果我们按依赖项(键j)排序,那么我们知道一旦j超过包的大小,我们就知道没有更多依赖项列表和for循环可以被打破。
排序后的列表:(4,1)(5,1)(1,2)(3,2)(8,3)(3,4)(5,4)(7,6)(6, 8)
此外,每次找到依赖项时,都会将其从临时数组中删除,然后将其递归传递给函数。 如果已经记录了依存关系,它还可以确保不进行调用或迭代/比较。
这可以进行大约37个比较,但是我知道这不是线性时间。我只是无法发现什么比已经达到的速度要快,很难分析我提出的算法的复杂性,但我认为它是O(n ^ 2 / b)>
答案 0 :(得分:1)
使用排序不适用于此问题。您将能够对所有节点进行排序,但可以确定在给定软件包变得困难之前需要安装的最少软件包。
更好的方法是将依赖关系视为图形中的边,并以相反的方向表示它们。也就是说,如果存在依赖项(i, j)
(意味着i
应该在j
之前安装),则在图形中从j
到i
添加一条边。现在已经定义了该图,需要在软件包x
之前安装的软件包列表就是这样定义的图中从x
可以访问的那些软件包。为了找到哪些节点可以使用和图形搜索算法,例如广度优先搜索或深度优先搜索。