Załóżmy, że podano mi liczb całkowitych o stałej szerokości (tzn. Mieszczą się one w rejestrze szerokości ), tak że ich suma również mieści się w rejestrze szerokości .w a 1 , a 2 , … a n a 1 + a 2 + ⋯ + a n = S w
Wydaje mi się, że zawsze możemy permutować liczby na tak, że każda suma prefiksu również mieści się w rejestrze szerokości .S i = b 1 + b 2 + ⋯ + b i w
Zasadniczo motywacją jest obliczenie sumy na maszynach o stałej szerokości bez martwienia się o przelanie liczb całkowitych na dowolnym etapie pośrednim.
Czy istnieje szybki (najlepiej liniowy czas) algorytm do znalezienia takiej permutacji (zakładając, że podano jako tablicę wejściową)? (lub powiedzieć, czy taka permutacja nie istnieje).
algorithms
arrays
integers
numerical-analysis
Aryabhata
źródło
źródło
-2^(n-1)
do2^(n-1)-1
. Wymaga to oczywiście uzupełnienia dwóch i dobrze zdefiniowanego zachowania przepełnienia, ale w języku takim jak C # powinno działać.Odpowiedzi:
Strategia0
Poniższy algorytm czasu liniowego przyjmuje strategię najechania kursorem około , wybierając liczby dodatnie lub ujemne na podstawie znaku sumy częściowej. Przetwarza listę liczb; oblicza permutację danych wejściowych w locie podczas wykonywania dodawania.
Algorytm
Poprawność
Poprawność można ustalić za pomocą prostego argumentu indukcyjnego dotyczącego długości listy liczb.
Po pierwsze, udowodnij, że jeśli są dodatnie (lub wszystkie ujemne), a ich suma nie powoduje przepełnienia, to też nie sumują prefiksu. To jest proste.a1,…,an
Po drugie, udowodnienie, że mieści się w granicach, jest niezmiennikiem pętli algorytmu. Oczywiście jest to prawdą po wejściu do pętli, ponieważ . Teraz, jeśli , dodanie liczby ujemnej mieszczącej się w granicach do nie spowoduje, że przekroczy granice. Podobnie, gdy dodanie liczby dodatniej, która jest w granicach do sumy, nie powoduje, że wychodzi poza granice. Zatem po wyjściu z pętli mieści się w granicach.S u m = 0 S u m > 0 S u m S u m S u m ≤ 0 S u m S u mSum Sum=0 Sum>0 Sum Sum Sum≤0 Sum Sum
Teraz można zastosować pierwszy wynik i razem są one wystarczające, aby udowodnić, że suma nigdy nie wychodzi poza granice.
źródło