[英]What is the time complexity of the Linear Search c code that i have written below? is my code good or bad?
//線性搜索
#include<stdio.h>
void main()
{
int a[]={1,2,3,4,5,6,7,8,9,10};
int key;
int v;
printf("Insert the number you want to find in the list::\n");
scanf("%d",&v);
for(int i=0;i<=10;i++)
{
if(a[i]==v){
key=i;
break;
}else{
key=-1;
}
}
if(key>=0){
printf("Number found at possition %d\n\n\n",key);
}
else{
printf("Sorry Not found in the list\n\n\n");
}
printf("A programme by Soumya Darshan Rauth");
}
您的程序以線性時間運行,適用於較小的數組。 對於任意輸入,您的程序是最佳的。 盡管我不認為每次找不到所需的值時都不需要將key = -1設置為。
key = -1; for(int i=0;i<=10;i++) { if(a[i]==v){ key=i; break; } }
即使這樣也可以。
線性搜索的線性時間復雜度為O(n),但是像您這樣固定大小的數組可以說它具有恆定的時間復雜度O(1)。
就像每個人都說的那樣,它是O(n),但是可以在O(log2(n))中搜索排序后的數組,因此在算法上並不是最好的方法
另外,在C上它很脆弱。 它不能用於10個數字,並且對於11以外的任何其他數字都會失敗。
通常,我們都有一個名稱,它是數組中元素的實際數量(我將使用舊式C,它將對任何東西都有效:
void main()
{
#define MAX_A (10)
int a[MAX_A]={1,2,3,4,5,6,7,8,9,10};
// deleted some stuff
for(int i=0; i<MAX_A; i++)
{
if(a[i]==v){
key=i;
break;
}else{
key=-1;
}
}
或者我們用這個有點奇怪的sizeof
計算來計算數組的正確大小
void main()
{
int a[MAX_A]={1,2,3,4,5,6,7,8,9,10};
// deleted some stuff
for(int i=0; i<sizeof(a)/sizeof(a[0]); i++)
{
if(a[i]==v){
key=i;
break;
}else{
key=-1;
}
}
這始終是數組的大小。
您可以編寫一個更直接的循環,例如
for (key=0; a[key]!= v && key<sizeof(a)/sizeof(a[0]); key++)
然后,匹配測試將更改為key < sizeof(a)/sizeof(a[0])
每當在數組中找不到該值時,就可以操縱變量“鍵”。
您可以做的一項改進就是將key變量初始化為-1,然后從循環中刪除“ else”代碼塊。
線性搜索始終具有復雜度O(n)。
通常,main方法的返回類型應始終為整數(0表示成功,其他所有內容均表示發生了錯誤)。 此外,main方法接受兩個參數,參數數量和參數作為char數組(int argc,char * argv [])。 如果不需要參數,則在括號(int main(void))之間編寫“ void”是一種很好的樣式。 在for循環中使用break語句通常被認為是不好的做法,因為在循環結束時/結束時並不明顯。 在您的情況下,while循環將提高可讀性。 while循環如下所示:
while (i < 10 && a[i] != v) {
i++;
}
if (i >= 10) { ... } // not found
else { ... } // found at position i
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.