- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给出未排序元素的列表。初始条件是 A=未排序元素的列表,p=1,N=总数组大小
Bubble(A,p,N)
if p>=N return
for i=p to N-1
if A[i]>A[i+1]
swap(A[i],A[i+1])
Bubble(A,p,N-1)
问题一:通过对N的归纳证明算法的正确性。我的问题:如何在 Bubble(A,p,N-1) 上使用 k+1?我需要有人为我解释和证明。
问题 2:证明如果一个元素一旦向 n 移动,则对于当前和所有即将进行的递归调用,它永远不会向 p 移动。(未解决)
我的问题:我知道在完成排序的第一个n-1 for循环后,数组中最大的整数值将排在最后一个位置。当调用 Bubble(A,p,N-1) 的递归时,数组大小将为 n-1,n-2,...n-n 并且最后的最大整数将不再与下一个和即将到来的递归调用进行比较.(这是一个很好的证明吗?如果没有,谁能给我一个更好的证明?)
问题3:给出一个场景,一个元素向p移动后,可以向n移动。(未解)
我的问题:我知道对于 1 到 n-1 的当前 for 循环,如果 A[i]>A[i+1] 那么它将交换 A[i+1] 最大的位置和 A [i] 将是最小的。然后调用Bubble(A,p,N-1)时,会再次比较n-1数组大小的整数值。如果 A[i]>A[i+1] 则交换。元素将被比较并交换 n-1,n-2,...,n-n。(这是一个好的场景吗?如果没有,谁能给我一个更好的场景?)
最佳答案
Question 1: Prove the correctness of the algorithm by induction on N. My Problem:How can i use k+1 on Bubble(A,p,N-1)?I need someone explain and proof for me.
证明是对 N 的归纳。
基本情况:当 N = 1 时,数组已经排序,并且 Bubble
正确地什么都不做并立即终止 if p >= N return
.
归纳假设:假设Bubble
正确排序大小不超过 k
的列表(强感应)。
归纳步骤:我们必须显示Bubble
正确排序大小为 k+1
的列表.关于 Bubble
的初始调用, p
小于 N = k+1
所以我们跳过算法的第一行。接下来,for
可以显示循环(也使用归纳法)具有以下循环不变量:在迭代 i = m
上, A[m+1]
将大于或等于 A[1]
通过A[m]
.因此,循环以 A[1], A[2], ..., A[k+1]
中的最大元素结束。在位置k+1
.如果大小为 k
,它将对问题进行递归调用。其中,根据归纳假设,Bubble
保证正确排序。自 A[k+1]
是最大的元素并且在末尾,因为所有较早的元素都通过对 Bubble
的递归调用正确排序, 证明排序是正确的。
(另一个的归纳证明留作练习。选择 N=2 和 p=1 作为您的基本情况。然后,假设不变量在 k
之前都为真。显示 k+1
。通过争论 swap
的作用。然后,根据 p
假定的最后一个值,说出数组的最终状态必须是什么。)
Question 2:Prove that if an element once moves towards n, it will never move towards p for current and all forthcoming recursive calls.(unsolved)
反证法。考虑位置 i
处的元素在一些调用的开始 Bubble
被 swap
感动了在 for
中循环到位置 j > i
.进一步假设 swap
s 在同一调用中,或 swap
s 在 Bubble
的另一个调用中, 使该元素的位置变为 k
与 k < j
.我们只需要考虑第一个这样的运动,因为如果有任何运动,那就是第一个。第一个这样的运动是由于 swap
在同一调用或 swap
在另一个调用中。分别考虑这些情况。
swap
当前调用中的 s 只能向前移动元素,不能向后移动。由于在此调用期间交换的元素永远不可能是任何交换的“下一个”元素,因此它不能向后移动。
swap
s 在 Bubble
的其他调用中可能会移动该元素,因为该元素将成为潜在 swap
之一的“下一个”元素;然而,这永远不会发生,因为这意味着数组中较早的元素有一个更大的元素,它会在之前调用“bubble”时“冒泡”通过所讨论的元素。我们假设我们的元素之前移动到了右边,这意味着它是迄今为止看到的最大的元素。
因为这是元素可以移动到 p
的仅有的两种方式而这些都不可能,我们有一个矛盾,这意味着我们假设元素可以向 p
移动是假的。
编辑:对于问题 3,考虑数组 [3, 2, 1] 的情况。第一次交换交换 3 和 2,将 2 移向 p。第二次交换交换 3 和 1,将 1 移向 p。 Bubble 递归调用的第一次交换交换 1 和 2,将 2 移回 n。通常,您会在很多情况下从反向排序的数组开始获得所描述的行为。
关于algorithm - 与我已经证明的相比,有人可以为我提供更好的冒泡排序证明和场景吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45170992/
据我所知,根本不为元素呈现 HTML,或添加 display:none,似乎具有完全相同的行为:两者都使元素消失并且不与 HTML 交互。 我正在尝试禁用和隐藏一个复选框。所以HTML的总量很小;我无
我刚刚读了Android Architecture Tutorial: Developing an App with a Background Service (using IPC) .基本上是 让服
我有两个查询具有相同的结果,现在我想知道哪个查询更优化? 在选择中: select t1.*, sum(t2.value) as total_votes from table1 t1 left joi
有人告诉我,对于 I/O 绑定(bind)的应用程序,非阻塞 I/O 会更好。对于 CPU 密集型应用程序,阻塞 I/O 会好得多。我找不到这种说法的原因。试过谷歌,但很少有文章只是触及这个话题而没有
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我从 API 收到一个 json,我需要解析并修改一个属性值。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。 这将禁止我指定在特定深度(如 parsedJson.children[0
我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后根据该距离对一些结果进行排序。现在我有两个选择: 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约
对于返回相同结果的不同查询,我有两个查询计划我想知道是否有人可以告诉我哪个“更好”,以及为什么。 SELECT * FROM bids order by (select ranking from us
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有一个二维数组。我需要尽可能快地对其执行一些操作(函数每秒将被调用十几次,所以让它变得高效会很好)。 现在,假设我想获取元素 A[i][j],简单地使用 A[i][j] 在速度上有什么不同吗和 *(
在声明或使用字符串的代码中,我通常会看到开发人员这样声明它: string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 代替: str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't CSS resets use '*' to cover all elements? 我正
如果我有一个包含许多重复项的 python 列表,并且我想遍历每个项目,而不是重复项,最好使用一个集合(如 set(mylist),或者找到另一种方法来创建没有重复的列表?我想只是循环遍历列表并检查重
在阅读常量接口(interface)反模式时,我发现没有实例的最终常量类比常量接口(interface)更好。 请解释一下怎么做? public interface ConstIfc { publ
我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是: bool func() { bool ret = true; ret &= test1();
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下我想发出一个访问者
我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容 在方法
public List getInts() { List xs = new ArrayList(); xs.add(1); // return Collections.unmo
我是一名优秀的程序员,十分优秀!