我是算法设计和分析的新手。我有一个嵌套循环和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语句中的原始操作数量吗?如果没有,那么请帮我纠正这个。感谢
答案 0 :(得分:0)
从技术上讲,我们无法确定这将发生多少次,因为它取决于数组的内容。一旦找到副本,整个事情就会终止。我们必须查看A[0]
到A[n-1]
中所有元素的完整内容,以提供确切的数字。
你可以说的是最多(A[]
中没有重复项),整个代码段将运行n
2
次。因此,其余部分假设没有重复:
i
和j
这种比较将发生n
2
次(同样,假设没有重复break
循环)。
AND
运营商A[i]
和A[j]
这些其他操作仅在i != j
为真时才会发生,因为大多数现代语言“短路”。当第一个条件失败时(换句话说,当i
和j
相同时),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;
}
}