【问题标题】:Data Structure for efficient distribution高效分发的数据结构
【发布时间】:2015-02-21 07:02:57
【问题描述】:

假设我有一列有 N 节车厢的火车。每辆货车in_i 牢房,而每个牢房有6 个座位。

现在假设 0 i 并希望坐在同一个牢房中。我想找到第一个在最坏情况下有足够空闲座位的合适单元O(log*n)

系统初始化最多需要O(n)

n=训练中的细胞总数。

我试图用 6*(货车数量)不相交的集合来解决这个问题,但是我很难维持这样一个复杂的解决方案。

PS:log*n 是一个迭代对数。

【问题讨论】:

  • 在这种特殊情况下,您已经知道 wagon 和 n_i 会相当小(比如
  • 这个问题纯属理论,因此你不能做出这样的假设。货车的数量和货车内的单元数可以是任意大的数字。
  • N 是否与您的问题相关?在我看来,为一辆货车解决这个问题与为N 解决它是相同的,因为您的查询仅针对特定的货车,对吧?
  • 确实,原来的问题比较复杂,所以我省略了一些细节。
  • 为什么不使用单元格作为主要对象,将它们保存在 7 个列表/数组中。 Array 0-> Empty Cells... Array 6 -> 6 个席位。将所有其他信息标记到单元格(货车索引等)。如果您需要一个可容纳 3 人的单元格,您可以在该索引后面找到它。然后将单元格转移到新位置。

标签: algorithm data-structures


【解决方案1】:

希望这不是一个意外遗漏,我的解决方案是让新到达的乘客在火车车厢中走一小段路。毕竟,问题描述中并没有写到他们应该在他们进入的马车上找到自己的座位。并且乘客步行的复杂性不会对算法的复杂性产生不利影响;)

以下数据类型以及数据的组织方式就足够了。 Index 成员只是为了让我们还可以跟踪 Cells,因为它们在新乘客到达时通过数据结构移动。类型 Cell 也可以简单地是一个 int(货车标识符,也只是提供信息)。

type Cell = { Index : int; Wagon : int }

现在,我们用列表数组来说明我们的问题。数组的大小为 7(单元格中有 0..6 个空位)。

我们从空车开始。所以所有单元格都在列表中,存储在数组索引 6 处(6 个空缺 = 空单元格)。

当 x 在 [1..6] 中有 x 的乘客到达时,我们所要做的就是测试 array[x] 到 array[6] 是否为非空。第一个非空列表包含一个我们想要填充乘客的单元格。

由于现在该单元格中的空缺是 oldVacancies(数组索引) - x,我们将单元格添加到数组 [oldVacancies - x] 中的列表中。

这个算法应该满足问题的复杂度要求……至少。

这里是 F# 中的示例实现:

module Trains =
    type Cell = { Index : int; Wagon : int }
    type Problem = List<Cell> []

    let init ncells cellsPerWagon =
        let initCells = 
            [ for i in 0..(ncells-1) do yield { Index = i; Wagon = i % cellsPerWagon } ]
        Array.init 7 (fun i -> if i = 6 then initCells else [] )

    let arrival (nPassengers : int) (problem : Problem) : Problem option =
        let rec findCell (index : int) : (Cell * int) option =
            if index > 6 then None
            else
                match problem.[index] with
                | [] -> findCell (index+1)
                | c::cs -> 
                    problem.[index] <- cs
                    Some(c,index)
        match nPassengers with
        | 0 -> Some(problem)
        | x when x > 6 -> None
        | _ -> 
            let maybeFound = findCell nPassengers
            match maybeFound with
            | Some(cell,vacancies) ->
                problem.[vacancies - nPassengers] <- cell :: problem.[vacancies - nPassengers]
                Some(problem)
            | None -> None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多