J'ai une mission de mon professeur CS:algorithme pour trouver s'il y a un i si ce tableau [i] i est égal à
Trouvez, en O (log n) temps, si dans un prétriés étant donné tableau d'entiers distincts il y a un index i de sorte que array [i] = i. Montrer que l'heure est O (logn).
Mise à jour: Les nombres entiers peuvent être négatifs, 0 ou positifs.
Très bien, j'ai donc eu un peu de mal avec ça. Mon idée est la suivante:
En utilisant la recherche binaire, nous pouvons seulement être certain qu'il n'y a pas une telle valeur à gauche de l'élément central si array [mid] < = startindex, où mid est l'indice de l'élément central, et startindex est le début du tableau.
La règle correspondante pour la moitié droite d'un tableau est ce tableau [mid]> = startindex + numel, où les variables comme ci-dessus et numel est le nombre d'éléments à droite de mid.
Cela ne semble pas O (logn), puisque dans le pire des cas, je dois itérer à travers le tout, non? Est-ce que quelqu'un peut me donner un pourboire dans la bonne direction ou me dire que ça fonctionne?
Des idées comment je pourrais prouver formellement cela? Je ne demande pas de réponse définitive, plus d'aide pour me faire comprendre.
En C:
int _solve_prob_int(int depth, int start, int count, int input[])
{
if(count == 0)
return 0;
int mid = start + ((count - 1)/2);
if(input[mid] == mid)
return 1;
if(input[mid] <= start && input[mid] >= start + count)
return 0;
int n_sub_elleft = (int)(count - 1)/2;
int n_sub_elright = (int)(count)/2;
if(input[mid] <= start)
return _solve_prob_int(depth + 1, mid + 1, n_sub_elright, input);
if(input[mid] >= start + count)
return _solve_prob_int(depth + 1, mid - n_sub_elleft, n_sub_elleft, input);
return _solve_prob_int(depth + 1, mid - n_sub_elleft, n_sub_elleft, input) ||
_solve_prob_int(depth + 1, mid + 1, n_sub_elright, input);
}
Un cas de test:
Sorted args: 1 2 3 4 5 6 7 8 9 10 11 12 :
Start: 0, count: 12, mid: 5 value: 6
Start: 0, count: 5, mid: 2 value: 3
Start: 0, count: 2, mid: 0 value: 1
Start: 1, count: 1, mid: 1 value: 2
Start: 3, count: 2, mid: 3 value: 4
Start: 4, count: 1, mid: 4 value: 5
Start: 6, count: 6, mid: 8 value: 9
Start: 6, count: 2, mid: 6 value: 7
Start: 7, count: 1, mid: 7 value: 8
Start: 9, count: 3, mid: 10 value: 11
Start: 9, count: 1, mid: 9 value: 10
Start: 11, count: 1, mid: 11 value: 12
Ce qui précède est ma fonctionner avec une sortie en fonction de la façon dont il recherche programme. Avec une liste de 1 à 12, il pivote autour de l'index 5, détermine qu'il pourrait y avoir une valeur entre 0-4 aux index 0-4. Il détermine également qu'il pourrait y avoir une valeur entre 6-11 aux index 6-11. Ainsi, je procède à une recherche les deux. Est-ce mal?
Les nombres dans le tableau d'entrée sont-ils garantis être uniques? –
@Adam oui, ils sont distincts. – Max