快速最小化延迟处理时间与空间高效的函数式离线部分持久树
快速最小化延迟处理时间算法
在任务调度中,为了优化延迟处理时间,我们可以通过对任务的截止日期进行着色来定义作业束。具体步骤如下:
1.
初始化
:最初,所有截止日期都未着色。选择一个 δ ∈(0, 1)。对于每个 k = 1, 2, … D#,如果 $\sum_{J_i\in J_k} p_i > P^{1 - \delta}$,则将截止日期 $d_k$ 着为红色。
2.
确定作业束
:重复以下过程,直到所有截止日期都被着色。
- 设 m 是截止日期 $d_m$ 尚未着色的最大索引。
- 找到满足以下条件的最小 k ≤ m:
- 条件 1:截止日期 $d_k$ 到 $d_m$ 都未被着为红色。
- 条件 2:$\sum_{i = k}^{m} \sum_{J_j\in J_i} p_j \leq P^{1 - \delta}$。
- 将所有截止日期 $d_k$ 到 $d_m$ 着为蓝色,并将它们“捆绑”成一组,记为 B(k, m)。我们称截止日期 $d_k$ 是束的开始,$d_m$ 是束的结束。
下面是该算法的流程图:
graph TD;
A[初始化所有截止日期未着色] --> B[选择 δ ∈(0, 1)];
B --> C[对每个 k 检查条件着红色];
C --> D[是否所有截止日期都着色];
D -- 否 --> E[找到最大未着色索引 m];
E --> F[找到最小 k 满足条件];
F --> G[将 dk 到 dm 着蓝色并捆绑];
G --> D;
D -- 是 --> H[结束];
引理 1
:红色截止日期的数量为 $O(P^{\delta})$,作业束的数量也为 $O(P^{\delta})$。
证明:显然,$\sum_{J_i\in J_k} p_i > P^{1 - \delta}$ 的截止日期最多有 $P^{\delta}$ 个。考虑一个作业束 B(k, m),截止日期 $d_1$ 最多可以是一个作业束的开始。假设 k > 1,由于 k ≤ m 是满足上述两个条件的最小索引,要么 $d_{k - 1}$ 是红色,要么 $\sum_{i = k - 1}^{m} \sum_{J_j\in J_i} p_j > P^{1 - \delta}$。
- 因为红色截止日期最多有 $P^{\delta}$ 个,所以 $d_{k - 1}$ 为红色的作业束 B(k, m) 最多有 $P^{\delta}$ 个。
- 考虑作业束 B(k, m) 的和 $\sum_{i = k - 1}^{m} \sum_{J_j\in J_i} p_j$,作业 $J_j \in J_{k - 1} \cup J_m$ 的 $p_j$ 最多可能出现在另一个对应不同作业束的和中,而作业 $J_j \in \bigcup_{i = k}^{m - 1} J_i$ 的 $p_j$ 不会出现在其他这样的和中。因此,所有和的总和不能超过 2P。由此可知,$\sum_{i = k - 1}^{m} \sum_{J_j\in J_i} p_j > P^{1 - \delta}$ 的作业束 B(k, m) 最多有 $2P^{\delta}$ 个。
算法 Solve(J) :该算法遵循算法 1 的结构,并对整个作业束进行额外处理,避免单独处理作业束中的每个截止日期。给截止日期着色需要 O(P) 时间。处理一个作业束需要 $\tilde{O}(P^{(1 - \delta) \cdot \alpha} + P)$ 时间,其中 $\tilde{O}(P^{\alpha})$ 是计算 (max, min)-斜卷积所需算法的运行时间。处理每个红色截止日期需要 $\tilde{O}(P)$ 时间。代入 $\delta = 1 - \frac{1}{\alpha}$ 得到总运行时间为 $\tilde{O}(P \cdot P^{1 - \frac{1}{\alpha}}) = \tilde{O}(P^{2 - \frac{1}{\alpha}})$。
定理 1
:算法 Solve(J) 返回从 $d_0$ 开始的最长可行调度。
证明:考虑算法 Solve(J) 的迭代 i,对于索引 i,使得 $d_i$ 是红色截止日期或 $d_i$ 是某个作业束 B(k, i) 的结束。为了证明该定理,只需证明在任何这样的迭代 i 结束时,集合 T 包含从 $d_0$ 开始的 $\bigcup_{j = 1}^{i} J_j$ 中所有作业的可行调度的处理时间。证明采用归纳法。基础情况很简单,因为 T 初始化为 {0}。考虑这样的迭代 i,并假设对于所有 i′ < i 且 $d_{i′}$ 是红色截止日期或 $d_{i′}$ 是某个作业束 B(k′, i′) 的结束的迭代,该断言成立。我们区分两种情况:
-
情况 1
:$d_i$ 是红色截止日期。根据归纳假设,在迭代 i 开始时,集合 T 包含从 $d_0$ 开始的 $\bigcup_{j = 1}^{i - 1} J_j$ 中作业子集的所有可行调度的处理时间。由于迭代 i 设置 T = T ⊕ S(Xi)(第 5 行),该断言成立。
-
情况 2
:$d_i$ 是某个作业束 B(k, i) 的结束。根据归纳假设,在迭代 i 开始时,集合 T 包含从 $d_0$ 开始的 $\bigcup_{j = 1}^{k - 1} J_j$ 中作业子集的所有可行调度的处理时间。设 I = {k, …, i}。$\bigcup_{J_j\in J_I}$ 中作业子集的任何可行调度的最大长度为 $P_I$。由于这些作业的最早截止日期是 $d_k$,我们保证任何这样的可行调度可以在 $d_k - P_I$(假设 $d_k - P_I \geq 0$)之前的任何时间开始。根据 M(I) 的定义,集合 $S_i = {x \in {0, …, P_I} : M(I)[x] \neq -\infty}$ 包含 $\bigcup_{J_j\in J_I}$ 中作业子集的所有可行调度的处理时间(第 10 行)。pref(T, $d_k - P_I$) 包含从 $d_0$ 开始并在 $d_k - P_I$ 之前结束的 $\bigcup_{j = 1}^{k - 1} J_j$ 中作业子集的所有可行调度的处理时间。由于迭代 i 设置 T = T ∪ (pref(T, $d_k - P_I$) ⊕ $S_i$)(第 12 行),在这一行之后,T 包含从 $d_0$ 开始的 $\bigcup_{j = 1}^{i} J_j$ 中作业子集的所有可行调度,并且还满足 $\bigcup_{j = 1}^{k - 1} J_j$ 中调度的作业长度之和最多为 $d_k - P_I$ 的条件。
以下是不同算法的时间复杂度对比表格:
| 算法 | 时间复杂度 |
| ---- | ---- |
| 之前已知算法 | $\tilde{O}(P^{\frac{5}{3}})$ |
| 本文算法 | $\tilde{O}(P^{\frac{7}{5}})$ |
| 通用情况 | $\tilde{O}(P^{2 - \frac{1}{\alpha}})$ |
空间高效的函数式离线部分持久树
在数据结构领域,将临时数据结构转换为持久数据结构是一个重要的研究方向。1989 年,Driscoll、Sarnak、Sleator 和 Tarjan 提出了将临时数据结构持久化的通用空间高效转换方法。本文的主要贡献是将这种转换适应到函数式模型中。
我们提出了一种将临时的、链接的数据结构转换为离线、部分持久的纯函数式数据结构的通用方法,其具有加法 $O(n \log n)$ 的构建时间和 $O(n)$ 的空间开销,其中 n 表示临时更新的数量。
TUNA 条件
:
- T:数据结构形成一个度为常数 d 的有根树。
- U:更新创建 O(1) 个新边和节点。
- N:考虑所有版本中创建的边时,更新不会创建循环。
- A:节点的属性值是静态的,即节点中存储的信息在插入后不会改变。这不包括指向子节点的字段。
许多数据结构,如二叉搜索树(BST)、Treaps、红黑树和函数式随机访问数组,都可以修改以满足 TUNA 条件,且不会有显著的渐近开销。
定理 1
:对于任何满足 TUNA 条件的临时链接数据结构,可以创建一个等效的、函数式的、离线部分持久的数据结构,保留渐近更新和查询时间,对于一系列 n 次更新,具有加法 $O(n \log n)$ 的构建开销和 $O(n)$ 的空间开销。
主要思想是将更新信息存储在一个列表中,包括边插入和删除的时间戳。在应用所有更新后,自底向上的拓扑排序产生一个有向无环图(DAG),该图支持对数据结构的任何先前版本进行查询。
推论 1 :存在一个纯函数式的平面点定位问题的解决方案,其构建时间为 $O(n \log n)$,查询时间为 $O(\log n)$,空间为 $O(n)$。
下面是不同数据结构在平面点定位问题上的结果对比表格:
| 参考 | 构建时间 | 查询时间 | 空间 | 模型 |
| ---- | ---- | ---- | ---- | ---- |
| David Kirkpatrick | $O(n \log n)$ | $O(\log n)$ | $O(n)$ | 命令式 |
| Seidel | $O(n \log n)$ | $O(\log n)$ | $O(n)$ | 命令式(预期界限) |
| Dobkin 和 Munro | $O(n \log n)$ | $O(\log^2 n)$ | $O(n \log n)$ | 命令式(基于持久数据结构) |
| Richard Cole | $O(n^2)$ | $O(\log n)$ | $O(n)$ | 命令式(基于持久数据结构) |
| Sarnak 和 Tarjan | $O(n \log n)$ | $O(\log n)$ | $O(n)$ | 命令式(基于持久数据结构) |
| Sarnak 和 Tarjan | $O(n \log n)$ | $O(\log n)$ | $O(n \log n)$ | 函数式(基于持久数据结构) |
| 新方法 | $O(n \log n)$ | $O(\log n)$ | $O(n)$ | 函数式(基于持久数据结构) |
在函数式编程中,数据结构天然具有持久性,但不一定空间高效。我们通过上述方法解决了函数式范式中离线部分持久化的空间开销问题。
快速最小化延迟处理时间与空间高效的函数式离线部分持久树(续)
函数式编程中的持久性概念
在函数式编程领域,数据结构的持久性是一个关键特性。持久性数据结构允许对其先前版本进行查询,而临时数据结构仅支持对当前版本的操作。部分持久数据结构是持久的,但只允许对最新版本进行更新;全持久数据结构则允许对任何版本进行查询和更新。
以下是持久性数据结构的分类列表:
-
临时数据结构
:不支持对先前版本的查询和更新。
-
部分持久数据结构
:可查询先前版本,但仅能更新最新版本。
-
全持久数据结构
:任何版本都能进行查询和更新。
在实现部分持久性时,有几种常见的技术:
-
存储所有版本副本
:一种简单但低效的方法,对于列表插入操作,n 次插入会产生 $Ω(n^2)$ 的空间开销。
-
胖节点技术
:由 Driscoll 等人引入,每个节点的指针字段被替换为带时间戳的指针列表。每次更新时,添加一个新的带时间戳的指针,每个更新的空间开销为 $O(1)$。查询旧版本时,需要对指针列表进行二分查找,会带来 $O(log n)$ 的查询开销。
-
路径复制技术
:在 BST 中,更新节点时复制到该节点路径上的所有节点。对于平衡 BST,每次更新的空间开销为 $O(log n)$,但查询时间除了找到正确的根节点外没有额外开销。
-
节点复制技术
:结合了胖节点和路径复制技术,在部分持久的通用指针数据结构中实现无查询时间和空间开销。通过在节点中保留额外的时间戳指针,更新时处理指针的时间戳和复制节点,在节点入度为常数的情况下,空间开销为加法 $O(n)$,查询时间开销为常数。
下面是不同持久性实现技术的对比表格:
| 技术 | 空间开销 | 查询开销 |
| ---- | ---- | ---- |
| 存储所有版本副本 | $Ω(n^2)$ | 无 |
| 胖节点技术 | $O(1)$ 每次更新 | $O(log n)$ |
| 路径复制技术 | $O(log n)$ 每次更新(平衡 BST) | 除找根节点外无 |
| 节点复制技术 | 加法 $O(n)$ | 常数 |
平面点定位问题及应用
平面点定位是计算几何中的经典问题,给定一个具有 n 条边的平面直线图和一个查询点 q,任务是创建一个数据结构,以最小的构建时间、查询时间和空间来支持报告包含查询点 q 的区域。
实现平面点定位的步骤如下:
1.
数据准备
:准备包含 n 条边的平面直线图。
2.
数据结构构建
:根据所选的算法和数据结构,构建支持查询的数据结构。
3.
查询操作
:输入查询点 q,使用构建好的数据结构进行查询,报告包含该点的区域。
下面是平面点定位问题的操作流程图:
graph TD;
A[准备平面直线图] --> B[构建数据结构];
B --> C[输入查询点 q];
C --> D[进行查询操作];
D --> E[报告包含点 q 的区域];
Sarnak 和 Tarjan 展示了使用部分持久排序集可以优雅地解决平面点定位问题。在函数式设置中,使用平衡搜索树和路径复制会导致 $O(n \log n)$ 的空间使用。而我们提出的技术可以将 Sarnak 和 Tarjan 的算法在函数式模型中实现为仅使用 $O(n)$ 的空间。
综上所述,通过快速最小化延迟处理时间的算法和空间高效的函数式离线部分持久树技术,我们在任务调度和数据结构领域取得了重要的进展。在任务调度中,优化了延迟处理时间的计算;在数据结构方面,解决了函数式范式中离线部分持久化的空间开销问题,并在平面点定位问题上实现了高效的解决方案。这些技术不仅提高了算法的效率,还为相关领域的研究和应用提供了新的思路和方法。
超级会员免费看

被折叠的 条评论
为什么被折叠?



