c++ - 用 Big-O Notation 计算我的程序的算法复杂度

标签 c++ binary big-o time-complexity

我创建了这个程序,它将对用户输入的订单列表进行二进制搜索,并输出他们想要在该列表中搜索的所需值。我的问题是我必须为我的代码的每个部分找到 Big-O Notation 中的算法复杂度,然后计算它的时间复杂度,但是,我并不擅长弄清楚 Big-O 表示法。如果可能的话,你能解释一下我是怎么做到的等等。这是我的代码,我已经尝试计算出某些行的算法复杂性,如果我做错了什么,请纠正我。

#include<iostream>
#include<vector>
using namespace std;


int binarySearch(vector<double> uservector, int, int);


int main()
{
int size;  // O(1)
int i;  //O(1)
int desirednum;  // O(1)

cout << "How many values do you want to enter: ";  // O(1)
cin >> size;  // O(1)
vector<double> uservector(size);

for (i = 0; i < size; i++)
{
    cout << "Enter a value: ";
    cin >> uservector[i];
}

cout << "What value are you looking for: ";  // O(1)
cin >> desirednum;  // O(1)

int location = binarySearch(uservector, size, desirednum);  

if( location > -1)
    cout << "The value " << desirednum << " was found at index " << location   << endl;  // O(1)
else 
    cout << "The value was not found in the list. \n";  // O(1)

system("PAUSE");
return 0;
}

int binarySearch(vector<double> uservector, int size, int value)
{
int low, mid, high;

low = 0;
high = size - 1;
while(low <= high)
{
    mid = ((low + high) / 2);
    if(value == uservector[mid])
    {
        return
            mid;
    }
    else if(value > uservector[mid])
        low = mid + 1;
    else
        high = mid - 1;
}
    return -1;
}

最佳答案

在某种程度上,您是对的。对其他人来说,你不知道。

int main()
{
int size;  // O(1)
int i;  //O(1)
int desirednum;  // O(1)

这些不是说明,而是声明。它们根本不需要运行时间。

cout << "How many values do you want to enter: ";  // O(1)

您根本不应该对算法开始之前发生的事情进行计数。

cin >> size;  // O(1)
vector<double> uservector(size);

for (i = 0; i < size; i++)
{
    cout << "Enter a value: ";
    cin >> uservector[i];
}

cout << "What value are you looking for: ";  // O(1)
cin >> desirednum;  // O(1)

您根本不应该对算法开始之前发生的事情进行计数。

int location = binarySearch(uservector, size, desirednum);  

if( location > -1)
    cout << "The value " << desirednum << " was found at index " << location   << endl;  // O(1)
else 
    cout << "The value was not found in the list. \n";  // O(1)

system("PAUSE");
return 0;
}

好的,现在开始你真正想要复杂的部分。

int binarySearch(vector<double> uservector, int size, int value)
{
int low, mid, high;

low = 0;
high = size - 1;
while(low <= high)
{
    mid = ((low + high) / 2);
    if(value == uservector[mid])
    {
        return
            mid;
    }
    else if(value > uservector[mid])
        low = mid + 1;
    else
        high = mid - 1;
}
    return -1;
}

您每次迭代都将到目标的距离减半,从而使您的复杂度达到 log2(N)。

关于c++ - 用 Big-O Notation 计算我的程序的算法复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29550293/

相关文章:

algorithm - 使用 5 位二进制补码进行十进制转换

c# - 如何在没有 BitConverter 的情况下交换 Int16 的字节顺序

algorithm - 为什么程序员更喜欢 O(N^3) 而不是 O(N^2)

python - 将 Python 标准 IO 暴露给子进程

c++ - 使用 objdump 或 gcc -c 将汇编指令转换为二进制

c++ - 伯克利套接字 : recv system call

algorithm - 如何找到给定关系的时间复杂度?

c++ - Borland C++ 不是 C++?

c# - 通过套接字TargetInvocationException进行二进制序列化/反序列化

python - Python 内部 hash() 函数的复杂性