繁体   English   中英

伪代码/ Java神秘算法

[英]Pseudocode/Java Mystery Algorithm

我有一个算法,我想知道它的作用。 我相信你们中的一些人可以看看这个并告诉我它的作用,但我已经看了半个小时了,我仍然不确定。 当我尝试玩它时,它会变得混乱。 打破像这样的算法你有什么技巧? 我如何分析这样的东西,知道发生了什么?

我的猜测是它将数字从最小到最大排序,但我不太确定。

1. mystery(a1 , a2 , . . . an : array of real numbers)
    2. k = 1
    3. bk = a1
    4. for i = 2 to n
        5. c = 0
        6. for j = 1 to i − 1
            7. c = aj + c
        8. if (ai ≥ c)
            9. k = k + 1
           10. bk = ai
    11. return b1 , b2 , . . . , bk

这是我尝试用Java编写的等价物,但我不确定我是否正确翻译:

public int[] foo(int[] a) {
        int k=1;
        int nSize=10;
        int[] b=new int[nSize];
        b[k]=a[1];
        for (int i=2;i<a.length;){
            int c=0;
            for (int j=1;j<i-1;)
                c=a[j]+c;
            if (a[i]>=c){
                k=k+1;
                b[k]=a[i];

谷歌从未停止过惊艳,因为29日我会接受它吗? ;)

Java翻译是一个好主意,一旦操作,您将能够逐步完成它,以便在您可视化时遇到问题时确切了解算法的作用。

一些指针:伪代码的数组索引为1n ,Java的数组索引为0length - 1 您的循环需要修改以适应这种情况。 你还离开了循环的增量 - i++j++

使b magic恒定大小也不是一个好主意 - 看看伪代码我们可以看到它写入最多n - 1次,所以这将是它的大小的一个很好的起点。 你可以调整它的大小以适应最后。

最后提示,算法的O(n 2 )定时。 这很容易确定 - 外部循环运行n次,内部循环n / 2次,总运行时间为(n *(n / 2))。 n * n占主导地位,这就是Big O所关注的,使其成为O(n 2 )算法。

最简单的方法是取一个样本,但是一小组数字并在纸上进行处理。 在你的情况下,让我们取数a[] = {3,6,1,19,2} 现在我们需要逐步完成您的算法:

初始化:

i = 2
b[1] = 3

迭代1后:

i = 3
b[2] = 6

迭代2后:

i = 4
b[2] = 6

迭代3之后:

i = 5
b[3] = 19

迭代4之后:

i = 6
b[3] = 19

结果b[] = {3,6,19}

你可能猜到它在做什么。

您的代码非常接近伪代码,但这些是一些错误:

  • 你的for循环缺少增量规则: i++j++
  • Java数组基于0,而不是基于1,因此您应该初始化k=0a[0]i=1

此外,这不是排序,更多的是过滤 - 您获得了一些元素,但顺序相同。

我如何分析这样的东西,知道发生了什么?

这种类似的基本技术是用铅笔和纸手工执行。

更先进的技术是将代码分解为多个部分,找出部件的作用,然后在心理上重新组装它。 (诀窍是选择分解的边界。这需要练习。)

一旦你变得更好,你将开始能够“读取”伪代码......虽然这个例子对于大多数编码人员来说可能有点过于粗糙。

转换为java时,请注意数组索引,因为这个伪代码似乎暗示了一个基于1的索引。

来自静态分析:

  • a是输入而不会改变
  • b是输出
  • k似乎是指向b元素的指针,只会在某些情况下递增(所以我们可以认为k = k+1意思是“下次我们写入b时,我们将写入下一个元件”)
  • 第6-7行的循环完成了什么? 那么c的价值是什么?
  • 使用之前的答案,当第8行是真的吗?
  • 因为第9-10行仅在第8行为真时执行,所以对输出中的元素有什么看法呢?

然后你可以开始理智地检查你的答案:

  • 是否会设置输出的所有元素?
  • 尝试使用类似[1,2,3,4]的输入来运行psuedocode - 你期望输出是什么?
def funct(*a)
  sum = 0
  a.select {|el| (el >= sum).tap { sum += el }}
end

Srsly? 谁发明了那些家庭作业问题?

顺便说一句:既然这是同时进行scanfilter ,并且filter依赖于scan ,哪种语言具有必要的特征来简洁地表达这一序列,使得序列只被遍历一次?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM