- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读 this paper在“轻微改进”部分的最后,作者说我们可以通过使用队列而不是数组来节省额外的 $log_{2}n$ 个问题。
我不明白这是怎么回事。我和 8 个人在纸上试了一下,无论是使用数组还是队列,在淘汰过程中都提出了相同数量的问题。
下面是数组方法的代码:
procedure Eliminate(V, E)
L ← MakeList
for v ∈ V do
add(L, v)
while L contains at least two elements do
u ← Remove(L)
v ← Remove(L)
if HasEdge(u, v) then
Insert(L, v)
else
Insert(L, u)
s ← Remove(L)
return s
这是队列伪代码
procedure Eliminate(queue)
while queue.size() >= 1 do
u ← queue.pop_front()
v ← queue.pop_front()
if HasEdge(u, v) then
queue.push_back(v)
else
queue.push_back(u)
s ← queue.pop_front()
return s
这里是验证函数
def verify(guests, c):
for g in guests:
if HasEdge(c, g) or !HasEdge(g, c):
return false
请您解释一下这两种方法在执行的比较次数方面有何不同?
最佳答案
你写的方法没有什么不同。你错过了重点。
一个潜在的接收器 v 在 Eliminate
中被调用到 HasEdge
至少 log(n)
次(很容易达到 prof)方法。
问题在于最小化 HasEdge
调用。每个记住调用的潜在接收器的字典将在 Verify
方法中保存对 HasEdge
的 log(n)
调用。
代码可以是这样的:
procedure Eliminate(V, E)
L ? MakeList
for v ? V do
add(L, Tuple(v, new Dictionary<Edge,bool>()))
while L contains at least two elements do
u ? Remove(L)
v ? Remove(L)
if HasEdge(u[0], v[0]) then
v[1].add(Edge(u[0], v[0]),true)
Insert(L, v)
else
u[1].add(Edge(u[0], v[0]),false)
Insert(L, u)
s ? Remove(L)
return s
procedure Verify(V, s)
for v ? V \ {s[0]} do
if (s[1].Contains(Edge(s[0],v)) then
if s[0][Edge(s[0],v)]
return false;
else
if HasEdge(s[0], v)
return false
if (s[1].Contains(Edge(v,s[0])) then
if !s[0][Edge(v,s[0])]
return false;
else
if !HasEdge(v,s[0])
return false
return true
关于arrays - 识别名人 : how does using a queue save logn questions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42846195/
对于那些非常了解这一点的人,只需阅读下面的粗体文本以了解实际问题。 辅助函数前言: 我知道合并两个相同等级的二项式树的复杂度为 O(1),因为所需要做的只是将 T1 的头部附加为另一个的 child
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
for(int i=1;i*i
有谁知道我可以在最坏情况下 O(logn) 访问和删除第 k 项的数据结构,并且还支持在最坏情况下 O(logn) 下在第 k 项之后插入一项的操作? 最佳答案 是的。您所描述的可以通过增强树来实现。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
实现合并所需的操作数是: ::::::6n (logn+1)= 6nlogn+6n. logn+1 是归并排序的层数。这里的 6n 是什么? 最佳答案 在原始合并排序的情况下:两次读取比较两个元素,一
我的算法课有问题。问题状态: Assume you are given an array of n integers in the range{1,...,logn**logn}. Show how
是否有一种类似集合的数据结构支持O(logn)时间的合并和O(logn)时间的第k个元素搜索? n 是这个集合的大小。 最佳答案 你可以试试 Fibonacci heap它确实在恒定摊销时间内合并并在
log n^2 等同于 2logn,它以与 logn 相同的速率增长,因为我忽略了因子和常量。但是,如果我要对整个项进行平方,以便得到 (logn)^2,它是否也是 logn 的大 theta? 最佳
Java TreeSet 类可以维持 add 方法的 O(logN) 成本。如果数据按排序顺序输入,这是如何工作的? 既然二叉搜索树的 add 方法在给定排序数据时会退化为 O(N),为什么 Tree
我有一个家庭作业问题如下(请注意,我不是在寻找确切的答案,只是在寻找简单的建议以继续前进)。 S is a data structure which supports Insert(x,S), Del
我正在使用一个优先级队列,该队列最初将其元素的优先级基于启发式方法。随着元素出队,启发式更新,并且当前队列中的元素的键可能会增加。 我知道有一些已摊销O(1)减少键操作的堆(特别是斐波那契堆),但是是
这个问题已经有答案了: Binary Search O(log n) algorithm to find duplicate in sequential list? (3 个回答) 已关闭 6 年前。
#include int powFast(int b, int e){ if(e==1){ return b; } else if(e%2 ==0){
这可能吗?我想到了这个: void binary_search(int list[], int lo, int hi, int key, int* maxIndex, int* minIndex) {
我已经为一个挑战编写了以下解决方案,但我不确定它的时间复杂度: def ASCIIConversion(string): newStr = '' for chr in string:
以下是一段 python 代码,用于使用 Goodrich 和 Tamassia 一书中的二进制递归查找元素列表的总和。 def binary_sum(S, start, stop): "
我想计算字典中给定值的项目数(假设字典中的值只是数字),我在网上搜索并找到了两种方法,first one : sum(x == chosen_value for x in d.values()) 第二
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 4 年前。 Improve t
我的问题 (您可以跳过此部分并转到下一部分以了解实际问题。这只是为那些真正想知道“您到底为什么要问这个?”的人提供的背景信息) 想象一个物体从无摩擦的山坡上滑下。有加速度为 0 的平坦区域。其余路径的
我是一名优秀的程序员,十分优秀!