Dopo aver visto che qualcuno in realtà ha postato una risposta seria a questa domanda, preferisco ripetere il mio imbroglio qui, che è un caso particolare della risposta descritta da @SimonNickerson:
O (1) non è possibile, a meno che non si è in radix 2, perché in questo modo, ogni numero diverso da 0 ha sia 1 e 0, e quindi la mia "soluzione" non funziona solo per gli interi ...
EDIT
Che ne dici di 2^k - 1? Non è tutto 1?
Drat! Vero ... avrei dovuto sapere che quando qualcosa sembra così facile, è in qualche modo imperfetto ... Se avessi risolto il caso tutti 0, avrei dovuto coprire anche il caso 1.
Fortunatamente questo caso può essere testato abbastanza rapidamente (se l'aggiunta e il bit AND sono considerati un'operazione O (1)): se x è il numero da testare, calcolare in questo modo: y=(x+1) AND x
. Se y=0
, quindi x=2^k - 1
. perché questo è l'unico caso in cui tutti i bit devono essere capovolti dall'aggiunta. Naturalmente, questo è un po 'imperfetto, poiché con lunghezze di bit che superano la larghezza del bus, gli operatori bit a bit non sono più O (1), ma piuttosto O (N).
Allo stesso tempo, penso che possa essere ridotto a O (logN), suddividendo il numero in blocchi di larghezza del bus e AND-ing insieme a quelli vicini, ripetendo finché ne rimane uno solo: se ci non erano 0 nel numero testato, l'ultimo sarà pieno anche 1s ...
EDIT2: Ho sbagliato ...Questo è ancora O (N).
Devi visitare ogni cifra. Costante significa che useresti lo stesso tempo per calcolare n = 1 come n = 123456789 –
ingannare sull'input (supponendo che il tempo necessario per dividere la stringa e trasformarlo in un set possa essere lasciato fuori dal gioco) – BigMike
O (N) per cosa N? grandezza di n? numero di cifre (ad es. registro)? – Kevin