Domanda relativa al tempo di esecuzione

0

Ho un array A di n interi, ordinato da min a max, e due numeri a < = b, che sono noti per essere in A. Vorrei scrivere uno pseudo-codice per una procedura il cui tempo di esecuzione è c1 + c2log (n) e che restituisce il numero di elementi in A che soddisfano un < = A [i] < = b.

Ho scritto quanto segue ma non sono sicuro che soddisfi i requisiti per il tempo di esecuzione e apprezzerei un po 'di aiuto:

NB < - denota una freccia

LBound(Input: integer n, sorted array of integers A, integer a) {
  min  ← 1
  max  ← n
  while (min <= max) {
mid  ←  |_(min + max) / 2_|
    if (A[mid] < a)
      min  ←  mid + 1
else
      max  ←  mid - 1
  }
  output(min)
}
LBound(Input: integer n, sorted array of integers A, integer a) {
  min  ← 1
  max  ← n
  while (min <= max) {
mid  ←  |_(min + max) / 2_|
    if (A[mid] > b)
      max  ←  mid - 1
else
      min  ←  mid + 1
  }
  output(max)
}
Range(Input: integer n, sorted array of integers A) { 
output (1 + UBound(n,A,b) – LBound(n,A,a)) 
}
    
posta peripatein 23.02.2014 - 10:53
fonte

1 risposta

1

Sì, l'approccio che hai selezionato soddisferà il requisito. Ogni ricerca binaria è O (log n), quindi due sono ancora O (log n).

No, non hai ancora il codice giusto. Hai un errore "off-by-one" nel primo blocco e una formattazione storpiata nel secondo blocco. Dato che stai utilizzando l'indice 1 basato, probabilmente c'è un altro errore "fuori-per-uno" nella tua ricerca binaria, ma fino a quando non ottieni la formattazione corretta è troppo difficile da capire.

In realtà, non ho scritto una ricerca binaria da anni. Non è quello che le librerie C / C ++ sono per?

    
risposta data 23.02.2014 - 14:59
fonte

Leggi altre domande sui tag