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))
}