IF声明中的原始操作数

时间:2018-03-11 13:41:29

标签: algorithm array-algorithms

我是算法设计和分析的新手。我有一个嵌套循环和if语句。我无法确定在if语句中完成的基本操作。声明如下:

// error_boundary_test.js
import React from 'react';
import { expect } from 'chai';
import { shallow } from 'enzyme';

import App from './some/path/app';

describe('App', ()=>{
    it('wraps children in ErrorBoundary', ()=>{
        const component = mount(<App />);
        expect(component).to.have.descendants(ErrorBoundary);
    });

我在if语句中确定操作次数如下:

for (i=0;i<n;i++)
 for(j=0;j<n;j++)
   if(i!=j and A[i]==A[j])
      duplicate=true
      break;
 if(duplicate)
   break;

所有这一切都要做了N次。我正确地猜测if语句中的原始操作数量吗?如果没有,那么请帮我纠正这个。感谢

1 个答案:

答案 0 :(得分:0)

从技术上讲,我们无法确定这将发生多少次,因为它取决于数组的内容。一旦找到副本,整个事情就会终止。我们必须查看A[0]A[n-1]中所有元素的完整内容,以提供确切的数字。

可以说的是最多A[]中没有重复项),整个代码段将运行n 2 次。因此,其余部分假设没有重复:

  • 比较ij

这种比较将发生n 2 次(同样,假设没有重复break循环)。

  • 访问数组元素2次
  • 比较AND运营商
  • 比较A[i]A[j]

这些其他操作仅在i != j为真时才会发生,因为大多数现代语言“短路”。当第一个条件失败时(换句话说,当ij相同时),if条件的其余部分将被忽略。永远不会处理AND,不访问数组元素,也不会比较数组元素。

因此,这些会运行n 2 -n次。 -n是因为每个j循环将始终与i迭代器匹配恰好一个值,从而使if条件的其余部分短路。

我将假设使用类似C语言并正确格式化代码,就好像这是一个C#片段一样:

// n and A[] initialized elsewhere
bool duplicate = false;
for(int i = 0; i < n; i++)
{
    for(int j = 0; j < n; j++)
    {
        if(i != j && A[i] == A[j])
        {
            duplicate = true;
            break;
        }    
    }
    if(duplicate)
    {
        break;
    }
}