算法分析| 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
数学表示:
Θ (g(n)) = {f(n): there exist positive constants c1, c2 and n0 such that 0 ≤ c1 * g(n) ≤ f(n) ≤ c2 * g(n) for all n ≥ n0}
Note: Θ(g) is a set
上述定义意味着,如果 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) 的渐近界(上限和下限)并提供算法的平均时间复杂度。
按照以下步骤计算任何程序的平均时间复杂度:
- 将程序分成更小的部分。
- 查找所有类型和输入数量,并计算它们要执行的操作数量。确保输入案例是均匀分布的。
- 求所有计算值的总和,并将总和除以输入的总数,假设在去除所有常数后获得的 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。
Average case time complexity =
⇒
⇒
⇒ (constants are removed)
何时使用 Big – Θ 表示法: Big – Θ 以最精确的精度分析算法,因为在计算 Big – Θ 时,考虑了不同类型和输入长度的均匀分布,它提供了算法的平均时间复杂度,即分析时最精确,但在实践中,有时很难找到算法的均匀分布输入集,在这种情况下,使用 Big-O 表示法来表示函数f 的渐近上限。