Rozważ następujący problem:
Dane wejściowe : wyświetla liczb całkowitych
Cel : ustalenie, czy istnieje liczba całkowita która znajduje się na obu listach.
Załóżmy, że obie listy mają rozmiar . Czy dla tego problemu istnieje deterministyczny algorytm czasu liniowego? Innymi słowy, czy możesz rozwiązać ten problem deterministycznie w czasie bez losowości?
Niestety nie można założyć, że wszystkie elementy listy są małe.
Widzę, jak rozwiązać go w oczekiwanym czasie za pomocą algorytmu losowego: losowo wybierz 2-uniwersalną funkcję skrótu , zapisz elementy w tablicy mieszającej (używając jako funkcji skrótu), a następnie wyszukaj każdy element aby sprawdzić, czy znajduje się w tablicy mieszającej. Oczekiwany czas działania to . Jednak nie widzę, jak znaleźć algorytm deterministyczny z czasem działania . Jeśli spróbujesz to zdemandomizować i naprawić pojedynczą konkretną funkcję skrótu, pojawi się dane wejściowe najgorszego przypadku, które powodują uruchomienie tej procedury wczas. Najlepszy deterministyczny algorytm, jaki mogę znaleźć, polega na sortowaniu wartości, ale nie będzie to czas liniowy. Czy możemy osiągnąć liniowy czas pracy?
Widzę też, jak rozwiązać ten problem w czasie liniowym, jeśli założymy, że wszystkie elementy listy są liczbami całkowitymi z zakresu (w zasadzie sortuj według liczenia) - ale interesuje mnie to, co dzieje się ogólnie przypadek, gdy nie możemy tego założyć.
Jeśli odpowiedź zależy od modelu obliczeniowego, model pamięci RAM przywołuje na myśl, ale interesują mnie wyniki dla każdego rozsądnego modelu obliczeniowego. Zdaję sobie sprawę z dolnych granic algorytmów drzewa decyzyjnego dla unikalności elementu , ale nie jest to ostateczne, ponieważ czasami możemy znaleźć algorytmy czasu liniowego, nawet jeśli istnieje związany w modelu drzewa decyzyjnego.
Odpowiedzi:
Możesz rozwiązać problem w czasie liniowym, jeśli masz wystarczającą ilość pamięci, aby mieć bit dla każdej możliwej wartości w X i Y. Nie nakłada to żadnych ograniczeń w porządkowaniu X i Y.
źródło
Ponieważ mówisz, że dwie listy zawierają liczby całkowite, myślę, że możemy uruchomić sortowanie radix na dwóch listach, a następnie przeprowadzić liniowe wyszukiwanie porównując dwie listy dla równoważnych elementów.
źródło
Dlaczego nie wstawić liczb całkowitych z każdej listy do prostej operacji bitowej? Czy nie byłoby to optymalne w tym sensie, że , gdzie to średni rozmiar bitów liczb całkowitych; w szczególności nie widzę, jak można to zrobić lepiej, ponieważ zwykłe * przeczytanie * dwóch list zajęłoby tyle czasu.O(n⋅m¯¯¯¯¯) m¯¯¯¯¯
źródło
Jest podobny do problemu unikatowości Elemeta, w którym masz zestaw liczb n i chcesz ustalić, czy wszystkie elementy są różne. Problem ma dolną granicę drzewa obliczeń algebraicznych .O(nlogn)
źródło