2011-02-01 10 views
-1

décrivent un algorithme qui peut déterminer la longueur d'un tableau dans O (log n).algorithme pour déterminer la longueur du tableau

+0

Étant donné les hypothèses? – jason

+2

Votre question est tellement impérative que j'ai envie de faire mes devoirs. –

+0

Vous pouvez trouver la longueur d'un tableau dans O (1). Nous avons besoin de plus de contexte pour y répondre. – Olhovsky

Répondre

0

C pseudo-style:

int lengthOfArray(p){ 
    int j = 1; 
    try{ 
     while(j < Integer.MaxValue){ 
      p[j]; // Might need to do something more with p[i] 
        // to test bound. 
      j *= 2; 
     } 
    }catch(ArrayIndexOutOfBounds e){ 
    } 
    j = searchArrayHelper(p, j/2, j); 

    try{ 
     while(1){ 
      // This loop is guaranteed to run O(log n) times or less. 
      p[j]; 
      j++; 
     } 
    }catch(ArrayIndexOutOfBounds e){ 
     j--; 
    } 

    return j; 
} 

int searchArrayHelper(p, int i, int j){ 
    try{ 
     p[j]; 
    } catch (ArrayIndexOutOfBounds e){ 
     int mid = (i + j)/2; 
     return searchArrayHelper(p, i, mid); 
    } 
    return i; 
} 
+0

Il semble que dans votre seconde fonction vous retourniez le premier p [j] que vous trouvez qui ne déclenche pas _ArrayIndexOutOfBounds_, mais comment êtes-vous sûr que p [j + 1] va le déclencher, et j est le tableau longueur? –

+0

@belisarius, vous avez raison, il peut y avoir un petit bug là-bas. Je vais modifier la réponse pour publier une solution rapide. – Olhovsky

+0

J'ai fait le correctif, bien qu'il se sent comme un hack sale. Faites-moi savoir si vous remarquez d'autres bugs. – Olhovsky

2

Ok. Je vais poster le commentaire que j'ai fait ci-dessus comme réponse, bien que votre question soit plutôt vague. Passez par i = 1, 2^1, 2^2, ... 2^m jusqu'à l'apparition de l'erreur ArrayIndexOutofBounds.

Recherchez ensuite binaire entre 2^(m-1) et 2^m jusqu'à ce que vous trouviez la frontière où l'erreur a disparu. C'est n.

Il est O (logn)

Modifier

Cette suggestion est basée sur l'extrait que vous avez posté un commentaire, où il est clair que vous êtes autorisé à détecter ArrayIndexOutOfBounds

Questions connexes