Załóżmy, że mam miliony ciągów znaków. Każdy ciąg ma wartość int. Chcę pobrać tę wartość przez ciąg wejściowy, ale nie chcę przechowywać wszystkie te ciągi, ponieważ zajmuje dużo miejsca. Nie mogę używać tablicy haszującej, ponieważ musi ona przechowywać w pamięci wszystkie lub co najmniej wiele ciągów znaków. Więc jaka jest dobra struktura danych dla mojej sprawy (nie muszę dodawać ani usuwać żadnych ciągów, mam już przygotowane dane, a odczyt jest dozwolony tylko dla operacji).Pamięciowy sposób przechowywania ciągów znaków
Odpowiedz
Powód, dla którego nie należy korzystać z tabeli skrótów, nie brzmi poprawnie w oparciu o ograniczone informacje w Twoim pytaniu. Jest dość skuteczny, jeśli jest dobrze zaimplementowany. Może także mieć tę zaletę, że nie marnuje pamięci przechowującej duplikaty łańcuchów, jeśli jest to akceptowalne dla twoich potrzeb, dodatkowo zmniejszając zużycie pamięci, jeśli duplikaty są możliwe.
Możliwe jest również zapisanie skompresowanej postaci każdego ciągu znaków w tabeli mieszania, jeśli twórczy był sposób wyszukiwania. Jak długo są typowe struny?
Średnia długość to 10 liter. Przynajmniej nie mogę przechowywać ciągów za pomocą jednego elementu wiaderka mojego hashtable. Sądzę więc, że istnieje sposób na udoskonalenie tego podejścia. – Neir0
Użyj trie aby zapobiec przechowywania wspólne podciągi ..
Trie to dobry pomysł, ale znacznie wolniejszy niż hashtable. – Neir0
@larsmans Heh!Wcześniej chodziło mi o coś takiego, aby zmaksymalizować efektywność bardzo dużego schematu regex, ale teraz zastanawiam się, czy robi się to automatycznie, gdy piszowy łańcuch regex jest analizowany. Miło wiedzieć, jak się nazywa. – Nolo
a hashtable nie jest wydajną pamięcią przechowywania strun, ale – argentage
Możesz zajrzeć na Judy tree, który został zaprojektowany, aby być zarówno szybki i zwarty i ma wersję przeznaczoną dla kluczy smyczkowych. Jego wdrożenie jest dostępne pod numerem sourceforge.
Jeśli możesz wstępnie przetworzyć listę słów, spójrz na doskonałe skróty, takie jak CMPH. (gperf jest inny, ale wydaje się zoptymalizowane dla mniejszych zestawów danych).
Z Dokumenty CMPH:
Doskonałym hash odwzorowuje statycznego zestaw kluczy n do zbioru liczb całkowitych m bez kolizji gdzie m jest większe lub równe n. Jeśli m jest równe n, funkcja nazywa się minimal.
...
CMPH Biblioteka obudowuje najnowszych i bardziej efektywnych algorytmów w łatwym w obsłudze, produkcyjnej jakości, szybkiej API. Biblioteka została zaprojektowana do pracy z dużymi wpisami, które nie mieszczą się w pamięci głównej. Z powodzeniem wykorzystano go do skonstruowania minimalnych, doskonałych funkcji skrótu dla zestawów zawierających ponad 100 milionów kluczy, ...
- 1. Pamięciowy sposób przechowywania 32-bitowej liczby całkowitej ze znakiem w Redis
- 2. Tablica ciągów ciągów znaków
- 3. Pythonowy sposób generowania rotacji ciągów znaków
- 4. Inteligentny sposób na znalezienie kodowania ciągów znaków?
- 5. Szybki sposób inicjalizacji listy numerowanych ciągów znaków?
- 6. Niepoprawna operacja ciągów znaków
- 7. C# tłumaczenie ciągów znaków
- 8. Przeciążanie literowe ciągów znaków
- 9. MySQL najlepszy sposób przechowywania długich łańcuchów
- 10. Która kolekcja do przechowywania unikatowych ciągów?
- 11. PHP: indeksowanie ciągów znaków
- 12. Porównanie inteligentnych ciągów znaków
- 13. Dopasowywanie rozmytych ciągów znaków
- 14. C Biblioteka ciągów znaków
- 15. java.sql.Timestamp sposób przechowywania nanosekund
- 16. Jak sformatować listę ciągów znaków
- 17. Losowy ciąg znaków z listy ciągów znaków
- 18. GetHashCode() z kluczami ciągów znaków
- 19. Lepszy sposób porównywania ciągów znaków, który mógłby być pusty.
- 20. skuteczny sposób wyszukiwania ciągu w liście ciągów znaków?
- 21. Czy istnieje sposób łączenia ciągów znaków w atrybutach HTML?
- 22. Elegancki sposób zwracania dłuższego z dwóch ciągów znaków
- 23. szybki sposób na usunięcie ciągów znaków z małych liter?
- 24. Najszybszy sposób znalezienia ciągu znaków w tablicy ciągów
- 25. Python - krótki sposób rozpakowywania listy dla operatora formatowania ciągów znaków?
- 26. Implementacja interpolacji ciągów znaków Python
- 27. "Właściwy" sposób przechowywania danych binarnych za pomocą C++/STL
- 28. Porównywanie ciągów znaków w EL
- 29. Efektywny algorytm sortowania ciągów znaków
- 30. Nieefektywne wykorzystanie konkatenacji ciągów znaków
Jaki język programowania? Czy istnieje wiele identycznych ciągów? –
@ jdv-Jan de Vaan Nie wszystkie napisy są niepowtarzalne. Nie sądzę, że mój specyficzny język pytania, ale wolę C#. – Neir0
Nie jest jasne, co należy zrobić. Czy potrzebujesz wyodrębnić te liczby i zapisać do innego pliku? Czy musisz wykonać z nimi jakieś obliczenia? Czy wszystko jest w porządku, jeśli kolejność danych wejściowych nie jest zachowana? –