针对以下问题提出线性时间解决方案

时间:2018-11-07 08:48:12

标签: algorithm sorting time-complexity complexity-theory

有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)

1 个答案:

答案 0 :(得分:1)

使用排序不适用于此问题。您将能够对所有节点进行排序,但可以确定在给定软件包变得困难之前需要安装的最少软件包。

更好的方法是将依赖关系视为图形中的边,并以相反的方向表示它们。也就是说,如果存在依赖项(i, j)(意味着i应该在j之前安装),则在图形中从ji添加一条边。现在已经定义了该图,需要在软件包x之前安装的软件包列表就是这样定义的图中从x可以访问的那些软件包。为了找到哪些节点可以使用和图形搜索算法,例如广度优先搜索或深度优先搜索。