Zacznę jakimś tle:Optymalizacja tablicę tribools na przestrzeni
Przez „tribool” Rozumiem zmienną, która może pomieścić jedną z następujących wartości: true
, false
lub null
.
W pytaniu Copying array of ints vs pointers to bools, OP chciał mieć szereg tribooli (mniej więcej), które byłyby tak małe, jak to tylko możliwe.
Z "odrobiną" większości podstawowych bit-fu znalazłem rozwiązanie, które wykorzystywało 2 bity na tribool i pozwalało przechowywać tablicę OP z 64 tribools w 16 bajtach, co jest w porządku.
Mechanicy tribool używałem były proste, jak:
- Boolean oznacza "null lub nie null",
- logiczna B oznacza "prawda czy fałsz, jeśli nie jest pusta".
Ale potem pomyślałem ... An algorytmicznych definicja „bit” jest:
nieco to ilość informacji, która określa, który z dwóch równie prawdopodobnych zdarzeń powinien pojawić się.
Oczywiście wartość true/false jest 1-bitowa. Dwie wartości true-false jako całość są 2-bitowe.
A co z naszym konceptualnym tryboolem?
Moja uwaga: Pod względem wielkości zawartych informacji, tribool jest większy niż 1 bit, ale mniejszy niż 2 bity.
- Uzasadnienie 1: Załóżmy, że implementujemy nasze, jeśli boolean, jak opisano powyżej. Jeśli wartość logiczna A jest "null", wartość boolean B jest nadmiarowa i nie zawiera żadnych istotnych informacji.
- Uzasadnienie 2: To jest niemożliwe do przechowywania informacji z 2 niezależnych wartości logicznych w jednym tribool, więc ma
(Żadne z powyższych jest formalny dowód, ale wierzę, że możemy się zgodzić, że o " wielkość”tribool ściśle większe niż 1 bit i ściśle mniejsza niż 2.)
Moje pytanie brzmi:
Jak programowo skorzystać z faktu, że tribool mniej informacje niż 2 bity i implementować w oprogramowaniu (c, C++?) tablicę N tribooli, które miałyby ślad pamięci mniejszy niż N/4
bajtów dla niektórych N?
Tak, rozumiem, że taka implementacja nie jest naprawdę przyjazna sprzętowo i działałaby wolniej niż jakikolwiek typowy roztwór z nadmiarowości (jak te przedstawione w pytaniu PO). Po prostu zoptymalizujmy przestrzeń, a nie wydajność.
Oczywiście ta implementacja wymaga innej reprezentacji triboola niż pary zmiennych (która sama w sobie jest zbędna, jak opisano wcześniej). Teoria mówi, że możliwe jest osiągnięcie tego celu i chciałbym zobaczyć rzeczywistą implementację. Jakieś pomysły?
Optymalizacja w kosmosie z pewnością wykorzystałaby czas jako ofiarę. Ale tak, to jest możliwe. –
Oczywiście :) Najbardziej interesuje mnie podejście do rozwiązywania takich problemów. Choć prawdopodobnie nie jest to najbardziej wykonalne użycie bit-fu, sam problem wydaje się bardzo interesujący, a odpowiedź byłaby bardzo cenna pod względem doświadczenia w rozwiązywaniu podobnych problemów w rzeczywistych sytuacjach. – Kos