📜  算法分析| Big – Θ (Big Theta) 符号

📅  最后修改于: 2022-05-13 01:56:06.080000             🧑  作者: Mango

算法分析| Big – Θ (Big Theta) 符号

在算法分析中,渐近符号用于评估算法在最佳情况和最坏情况下的性能。本文将讨论由希腊字母 (Θ) 表示的 Big – Theta 符号。

定义:设 g 和 f 是从自然数集到自身的函数。如果有常数 c 1 , c 2 > 0 和一个自然数 n 0使得 c 1 * g(n) ≤ 函数 (n) ≤ c 2 * g(n ) 对于所有 n ≥ n 0

数学表示:

上述定义意味着,如果 f(n) 是 g(n) 的 theta,那么对于较大的 n (n ≥ n) 值,f(n) 的值始终介于 c1 * g(n) 和 c2 * g(n) 之间0 )。 theta 的定义还要求 f(n) 对于 n 大于 n 0的值必须是非负的。

图示:

图示

用简单的语言来说,Big – Theta(Θ) 表示法指定函数f(n) 的渐近界(上限和下限)并提供算法的平均时间复杂度。

按照以下步骤计算任何程序的平均时间复杂度:

  1. 将程序分成更小的部分。
  2. 查找所有类型和输入数量,并计算它们要执行的操作数量。确保输入案例是均匀分布的。
  3. 求所有计算值的总和,并将总和除以输入的总数,假设在去除所有常数后获得的 n 的函数是 g(n),然后在 Θ 表示法中表示为 Θ(g(n))

示例:考虑一个使用线性搜索查找键是否存在于数组中的示例。这个想法是遍历数组并检查每个元素是否等于键。

伪代码如下:

bool linearSearch(int a[], int n, int key)
{
    for (int i = 0; i < n; i++) {
        if (a[i] == key)
            return true;
    }

    return false;
}

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to find whether a key exists in an
// array or not using linear search
bool linearSearch(int a[], int n, int key)
{
    // Traverse the given array, a[]
    for (int i = 0; i < n; i++) {
 
        // Check if a[i] is equal to key
        if (a[i] == key)
            return true;
    }
 
    return false;
}
 
// Driver Code
int main()
{
    // Given Input
    int arr[] = { 2, 3, 4, 10, 40 };
    int x = 10;
    int n = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
   
    if (linearSearch(arr, n, x))
        cout << "Element is present in array";
    else
        cout << "Element is not present in array";
 
    return 0;
}


Java
// Java program for the above approach
import java.lang.*;
import java.util.*;
 
class GFG{
 
// Function to find whether a key exists in an
// array or not using linear search
static boolean linearSearch(int a[], int n,
                            int key)
{
     
    // Traverse the given array, a[]
    for(int i = 0; i < n; i++)
    {
         
        // Check if a[i] is equal to key
        if (a[i] == key)
            return true;
    }
    return false;
}
 
// Driver code
public static void main(String[] args)
{
     
    // Given Input
    int arr[] = { 2, 3, 4, 10, 40 };
    int x = 10;
    int n = arr.length;
 
    // Function Call
    if (linearSearch(arr, n, x))
        System.out.println("Element is present in array");
    else
        System.out.println("Element is not present in array");
}
}
 
// This code is contributed by avijitmondal1998


Python3
# Python3 program for the above approach
 
# Function to find whether a key exists in an
# array or not using linear search
def linearSearch(a, n, key):
 
    # Traverse the given array, a[]
    for i in range(0, n):
 
        # Check if a[i] is equal to key
        if (a[i] == key):
            return True
     
    return False
 
# Driver Code
 
# Given Input
arr =  2, 3, 4, 10, 40
x = 10
n = len(arr)
 
# Function Call
if (linearSearch(arr, n, x)):
    print("Element is present in array")
else:
    print("Element is not present in array")
     
# This code is contributed by shivanisinghss2110


C#
// C# program for above approach
using System;
 
class GFG{
 
// Function to find whether a key exists in an
// array or not using linear search
static bool linearSearch(int[] a, int n,
                            int key)
{
     
    // Traverse the given array, a[]
    for(int i = 0; i < n; i++)
    {
         
        // Check if a[i] is equal to key
        if (a[i] == key)
            return true;
    }
    return false;
}
 
 
// Driver Code
static void Main()
{
    // Given Input
    int[] arr = { 2, 3, 4, 10, 40 };
    int x = 10;
    int n = arr.Length;
 
    // Function Call
    if (linearSearch(arr, n, x))
        Console.Write("Element is present in array");
    else
        Console.Write("Element is not present in array");
}
}
 
// This code is contributed by sanjoy_62.


Javascript


输出
Element is present in array

在线性搜索问题中,我们假设所有情况都是均匀分布的(包括数组中不存在键的情况)。因此,对所有情况求和(当键出现在位置 1、2、3、……、n 并且不存在时,并将总和除以 n + 1。

何时使用 Big – Θ 表示法: Big – Θ 以最精确的精度分析算法,因为在计算 Big – Θ 时,考虑了不同类型和输入长度的均匀分布,它提供了算法的平均时间复杂度,即分析时最精确,但在实践中,有时很难找到算法的均匀分布输入集,在这种情况下,使用 Big-O 表示法来表示函数f 的渐近上限。