簡體   English   中英

我在下面編寫的線性搜索c代碼的時間復雜度是多少? 我的代碼是好是壞?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM