sobota, grudnia 16, 2017

Liczenie Pi ;-)

Okazuje się, że mam już tyle Rasbperry Pi, że muszę je liczyć ;-)

Trzy robią za "serwery".
Jedno jest częścią mojego czujnika sit/stand.
Jedno jest wbudowane w robota i jest off-line.
Jeszcze jedno w AIY Voice Kit i też jest off-line.
Najstarsze oryginalne Raspberry Pi B+ zaś leży w mojej kartonowej obudowie i też jest off-line.


Podobne postybeta
Dwa spostrzeżenia na dziś ;-)
Raport z planety Z ;-)
Nexus 4 - miłość dojrzewa ;-)
Moje centrum superkomputerowe ;-)
Czy się stoi czy się siedzi... Rasbperry Pi z czujnikami ultradźwiękowymi to stwierdzi ;-)

środa, grudnia 13, 2017

Ważne kto i jak liczy głosy....

Gdy była mowa o zmianie ordynacji wyborczej do samorządu pojawiło się info o zmianie, która sprawi, że znikną duże okręgi z powiedzmy 7 mandatami i będą góra takie z 3.
Czy to w końcu przeszło nie wiem, bo trudno znaleźć jakieś info o tym (bo nie ma kontroli wersji ;-)).

Ale taka zmiana wydaje się bardzo techniczna i mało znacząca.... jednak taka nie jest.

Bo istotne jest to jak się dzieli mandaty.
W wyborach samorządowych stosuje się metodę D’Hondta.

Czyli bierze się liczbę głosów na każdą liczbę. Później zapisuje dla każdej listy tą liczbę i tą liczbę podzieloną przez 2, podzieloną przez 3, podzieloną przez 4 i tak dalej, aż dzielnikiem będzie liczba mandatów.

Teraz bierze się szuka największej liczby. Ta lista dostaje mandat.
Skreśla się tą liczbę.

Szuka się znów największej liczby. Ta lista dostaje mandat numer 2.
Skreśla się tą liczbę.

I znów szuka największej i tak dalej i tak dalej, zależnie od tego ile jest mandatów.

Jeśli jest dokładnie 1 mandat, jest najgorzej, bo mamy jednomandatowy okręg wyborczy.
Jeśli jest 9 kandydatów i każdy dostał 9.9% głosów i jeden kandydat, który dostał 10.1% to on dostanie mandat.
Czyli tylko 10.1% wyborców będzie miało reprezentację w swoim okręgu.

Jeśli są 2 mandaty to na 100% jeden dostanie lista, która miała najwięcej głosów. Drugi też może dostać (wystarczy, że dostała trochę ponad 2 razy więcej głosów niż kolejna lista).
Nadal słabo z reprezentatywnością. Lepiej niż przy JOWach, ale nadal słabo.

Przy 3 jest lepiej, ale nadal źle.

Im więcej mandatów tym są one bliższe preferencji wyborców....

Jednak w pewnym momencie jest problem bo chcielibyśmy jednak by liczba mandatów ogólnie nie była za duża, i chcemy by ludzie mogli głosować na znanych sobie kandydatów.
Przez to najlepiej celować w taką liczbę mandatów która może być rozdzielona na stosunkowo małym obszarze, ale tak by był ten podział w miarę reprezentatywny.

To co teraz chce zrobić PiS, czyli zmniejszyć liczbę mandatów prowadzi do tego, że największa partia dostanie ekstra bonus, bo jeśli będzie miała powiedzmy 31% głosów, druga będzie miała 20%, a trzecia 15% (resztę pomijamy). To pierwszy mandat pójdzie do pierwszej partii, drugi do drugiej, a trzeci do... pierwszej. Czyli mając 31% poparcia partia ta zbierze 66.6% mandatów.

A teraz jest tak, że PiS jest najsilniejszą partią.... Która nadal nie ma 50% poparcia, ale spokojnie może dostać w sejmikach ponad 50% dzięki szacher macher z liczbą mandatów.

Jak się do tego doda powołanie komisarzy politycznych (bo wskazywanych przez polityków), którzy będą wyznaczali granice okręgów to może być i lepiej niż 50%...
Bo tu znów wystarczy zrobić tak by np. osiedle gdzie wygrywa zwykle PO podzielić na 3 mniejsze okręgi i do każdego z nich dodać 3 inne osiedla gdzie wygrywa PiS tak by dostać mandaty z wszystkich 4 osiedli..

Tak na "pocieszenie", ale będzie "heca" jak się okaże, że ostatnie wolne wybory mieliśmy te 2 lata temu, nie?


Podobne postybeta
Jak można przegrać wybory gdy się je wygrywa?
I po wyborach :-)
1 na 9 głosów
Dołożę się do budżetu Rybnika ;-)
Demokracja 3.3 ;-)

wtorek, grudnia 12, 2017

Czemu Sejm i Senat nie korzystają z żadnego systemu kontroli wersji?

Takie pytanie...

Czemu jak się tworzy prawo to nie stosuje się żadnego systemu kontroli wersji?

Biznes zajmujący się produkcją oprogramowania zna to od lat.

Każdej linii można zawsze przypisać autora, można zobaczyć jak się wszystko zmieniało..

Co by szkodziło pracując nad prawem robić tak, że każde głosowanie nad poprawkami na komisji tworzy nową wersję projektu ustawy w repozytorium?

Później Sejm głosuje i jak w końcu przegłosuje to dostaje to taga - release candidate.
Senat głosuje, jak dodaje poprawki to są one robione na nowym branchu.

Ustawa wraca do Sejmu, Sejm zatwierdza lub odrzuca push requesty, głosuje w końcu nad ostateczną wersją i wypuszcza RC2 z informacją kiedy w razie przejścia przez bramkę jakości (Prezydenta) wchodzi w życie.

Prezydent jeśli podpisze to robi się tag - release. Jak następuje data gdy ustawa wchodzi w życie robi się tag - in_place.

Przecież to by wszystko ułatwiło.
Zawsze by było wiadomo gdzie i jakie poprawki wprowadzono.
Zawsze można by było mieć pewność, że nigdzie się nic nie "domergowało" bez zgody uprawnionych do tego ludzi.

Do tego można by było taką wersję ustawy ciągle mieć dostępną przez WWW...

Chociaż my chyba idziemy w układ gdzie jeden człowiek = jeden głos, a tym człowiekiem jest pierwszy sekretarz.....


Podobne postybeta
Skrócona wersja zmian w ustroju Polski po wyborach w 2015 roku
Atlas zbuntowany, ale na odwrót ;-)
O tym czemu branche są złe...
Wernyhora mode - wieszcze, że następną usługą w Google Play będą Filmy ;-) i że będzie to w ciągu 12 miesięcy ;-)
1 na 9 głosów

sobota, grudnia 09, 2017

Metryka do mierzenia jak interesujący są ludzie ;-)

Nowa (przynajmniej dla mnie ;-)) metryka do pomiaru ludzi mi się dziś pojawiła.
Jak często ktoś powoduje, że zmieniam zdanie, albo podaje mi argumenty których nie znam, a które pozwalają mi choć przez chwilę popatrzeć na problem z innej strony?

Tak sobie to przyłożyłem do kilku osób i chyba zaczynam widzieć common pattern u osób, które mi się wydają interesujące.

Zaczynam też rozumieć, że sam dla niektórych taki jestem, a dla innych nie. Oraz to, że czasem znajomość zaczyna się od takiego układu, ale później to gdzieś znika i jest takie utrzymywanie jej z grzeczności, czy przyzwyczajenia ale bez tego co ją na początku napędziło.

De facto stwierdzam, że ja szanuję właśnie takich ludzi.

Mam nawet chyba lepsze uogólnienie, ci ludzie muszą wykazać głębię myślenia o swoich poglądach.

Wiara w to, że się ma rację i opieranie się na tym to trochę za mało.

[Dodane po chwili, choć krótkiej ;-)]
W skrócie interesujący ludzie to ci, którzy sprawiają że myślę o różnych ideach, a nie tylko o nich ;-)


Podobne postybeta
6:22 czyli środek nocy
Szaleństwo kolorów - kolorujemy Google+ ;-)
Moja własna akcja w Google Home ;-)
Wydało się ;-)
Czemu strony only for IE są złe.

niedziela, grudnia 03, 2017

O wyższości Mavena nad Gradlem ;-)

Szczerze obu tak samo nie lubię, ale Maven ma jedną przewagę nad Gradlem.

Przez to, że Maven to konfiguracja przed kodem, a nie kod przed konfiguracją to pliki pom.xml Maven'a są proste do parsowania.
Wystarczy parser XML i jak chcemy wszystkie zależności projektu to robimy getElementsByTagName("dependency") i je mamy.
Zbudowanie z tego drzewa to pikuś.

Z Gradlem tak łatwo nie jest...
Bo niby zwykle w bloku dependencies { } mamy szereg compile... ale czasem nie mamy, albo mamy inaczej bo akurat w danym miejscu możemy używać innej wtyczki...

Zaczynam myśleć, że będę musiał wstrzyknąć się gdzieś w Groovy'iego...
Albo jeszcze lepiej założyć hooka na file system i czekać aż mi Gradle pobierze bibliotekę, i wtedy sprawdzić jaki task się wykonuje...
Nie, też to nie jest pomysł....

A wszystko żeby znaleźć KTO importuje pewną bibliotekę... (a dokładniej parę ;-))
Hmmm... a jakby ją skasować i zobaczyć kto się wywali? Albo po kolei odpalać każdego oddzielnego build.gradle i tak namierzyć drania?


Podobne postybeta
Trzy wielkie tajemnice Androida (od strony programisty)
Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)
Umiejętność programowania pomaga :-)
Komputer bez sieci nie ma już sensu
Jak zmusić Gradle'a do używania ramdysku (na OS X)

czwartek, listopada 30, 2017

Milion ton śniegu....

Zaczęła się zima... Nie ten pozer kalendarzowa, ale taka prawdziwa.
Spadł milion ton śniegu, dokładniej jakieś 1.5 mln ton... (Podobno w ciągu dnia to było 15 cm, przy założeniu że 1 m3 waży 30 kg)

Całe szczęście temperatura jest jeszcze dodatnia więc drań się roztapia i znika....

Gupi śnieg....

posted from Bloggeroid




Podobne postybeta
4 mln ton....
Zła zima!
Zasypywania ciąg dalszy...
Śnieg - brrr
Starzeję się ;-)

wtorek, listopada 28, 2017

Czas spierdalać...

Rozumowo już wiem, że teraz nadchodzi ten moment kiedy trzeba powiedzieć Polsce "siema" i spierdalać.

Ale dobrze zarabiam, mam mieszkanie, jest mi całkiem wygodnie.

Tak, władza robi mi powoli i skutecznie krzywdę, ale przecież jak na razie co najwyżej mnie to trochę więcej kosztuje, przecież np. nic nie mam wspólnego z sądami.... gorzej, że jak za powiedzmy 5 lat komuś z PiS spodoba się moje mieszkanie to usłużny PiSowski sąd uzna, że mieszkanie nie jest moje, a kogoś innego i powinienem jeszcze zapłacić za używanie....

A patrząc na to co robi PiS, to za 5 lat będzie gorzej niż sobie to wyobrażam.
2 lata temu byłem czarnowidzem, ale nie przewidziałem nawet 10% tego co wyprawiają i jak to robią.

Rozumowo wiem, że powinienem wziąć pierwszą w miarę przyzwoitą ofertę za granicą i patrzeć na to z boku....

Zawsze chciałem umieć sobie powiedzieć "OK, Przemek, jeśli X, Y i Z to nie ma bata robisz W".
Ale trudno zrobić to W....

Tak czarno pocieszające jest to, że z jednej strony działania PiS będą mnie dalej wkurwiały i przez to skrócą mi życie, do tego te działania spowodują, że wszyscy w miarę ogarnięci lekarze zrobią to co ja powinienem i wyjadą, więc nie będzie nawet nikogo żeby mi mękę przedłużyć....

Fuck, nie chcę czekać na moment kiedy zaczną strzelać...... bo wtedy będzie za późno...

Ktoś ma jakieś pomysły jak znaleźć w sobie siłę by się spakować i wyjechać?
Lepiej mieć w takim przypadku środki w postaci gotówki, czy nieruchomości?
Ktoś już wyjechał?


Podobne postybeta
Dawać sankcje!
Kto chce mieć szare życie?
Studia wyższe
Eclipse vs. NetBeans
Jak tak dalej pójdzie to Polacy wymrą....

niedziela, listopada 26, 2017

Średnia vs. mediana

Często gdy gdzieś podawane są dane o zarobkach pojawia się informacja o medianie i o tym, że mediana lepiej opisuje rzeczywistość od średniej...

Nie, wcale nie. Albo bardziej precyzyjnie, nie do końca i zależnie od tego co oznacza "opisywanie" rzeczywistości ;-)

Mediana to liczba, czy w przypadku zarobków kwota powyżej której znajdują się zarobki 50% badanych i poniżej niej znajdują się zarobki drugich 50% badanych.
W rzeczywistości mogą być 2 mediany, jeśli jest parzysta liczba próbek, ale to szczegół.

Średnia to suma wszystkich próbek, podzielona przez liczbę próbek.

Mediana dobrze opisuje rozkład z punktu widzenia pojedynczej próbki, średnia z punktu widzenia całej populacji.

Jeśli wiemy, że średnia pensja to powiedzmy 4600 PLN, to możemy w miarę łatwo znając rozmiar populacji policzyć ile pieniędzy mają wszyscy członkowie tej populacji.
Bo średnia to wartość dla której sumaryczny błąd (czyli zsumowana różnica między wartością dla pojedynczej próbki, a średnią, dla wszystkich próbek) będzie równa 0.
Do tego jeśli wyciągniemy 100 losowych ludzi to średnia z ich pensji będzie bliska średniej całej populacji (to jest akurat twierdzenie graniczne statystyki ;-)).
Średnia opisuje więc najlepiej rozkład "globalnie". Gdy interesuje nas 1 liczba, która najlepiej opisze całą populację to średnia jest tym co nas interesuje.
Z punktu widzenia badania "siły gospodarki" średnia się świetnie sprawdza.

Mediana działa bardziej lokalnie.
Wiedza, że mediana zarobków to 3510 PLN nie mówi nam wiele o całej populacji.
Mówi nam za to duże o najbardziej typowym przedstawicielu populacji.

Jeśli moglibyśmy udać się tylko na 1 polowanie na jednego przedstawiciela populacji to najpewniej złowilibyśmy takiego, którego pensja byłaby dość bliska mediany.

Mediana i średnia mogą znaczyć to samo, jak rozkład jest normalny.
Ale pensje nie podlegają rozkładowi normalnemu.

Jak już podlegają jakiemuś rozkładowi to bardziej rozkładowi potęgowemu (też nie do końca, ale wykres jest bardziej podobny, bo niemal blisko początku rozkładu mamy szczyt, a później bardzo długi ogon w kierunku wyższych liczb z gwałtownie malejącym prawdopodobieństwem)

Dlatego jeśli podajemy informacje o wynagrodzeniach gdy chodzi o opisanie całej populacji to średnia jest najlepszym sposobem na opisanie, bo mówi o całej populacji.
Gdy chcemy podać informacje o wynagrodzeniach tak by przeciętny człowiek mógł ją porównać ze swoimi zarobkami to powinniśmy używać mediany bo ona lepiej oddaje zarobki takiego pojedynczego ludzia.


Podobne postybeta
Pensje programistów
Android Marketowi odbiło
Przewidujemy wyniki wyborów ;-) - wyniki
Jak oceniasz swoje bezpieczeństwo? - podsumowanie
Język a postrzeganie rzeczywistości

sobota, listopada 25, 2017

HashMap - Z klawiaturą wśród struktur danych

HashMap to moja ulubiona struktura danych.

Jest szybka (O(1)), rozsądnie zarządza pamięcią (O(N)), a do tego jest przebiegła i chytra ;-)

Tutaj krótki* opis dla niekomputerowych ludzi co to jest i po co ;-)

Zacznijmy od nazwy.
Nasza struktura znana jest pod nazwą HashMap lub HashTable, czyli mapy lub tablicy hashującej.

Jest ona implementacją abstrakcyjnej struktury zwanej tablicą asocjacyjną.

Teraz po ludzku ;-)

HashMap zwana również HashTable to tablica hashująca.
Oba słowa są ważne.

Najpierw co to jest tablica.

To bardzo prosta, najprostsza chyba struktura danych.
Czyli najprostszy sposób na przechowywanie danych w pamięci komputera.

Po prostu układamy dane jedna za drugą. Mamy "przegródki" które mają identyczne rozmiary i znając rozmiar przegródki i pozycję tego co nas interesuje możemy tam od razu pójść.
Komputerowi do dotarcia do jakiegoś miejsca w pamięci potrzebny jest tylko adres tego miejsca.
A tablica pozwala na proste policzenie tego adresu.
Do tego komputer potrzebuje praktycznie tyle samo czasu na dotarcie do dowolnego miejsca w pamięci.
Z tablicą wystarczy znać numer "przegródki" i rozmiar przegródek. Do tego jeszcze adres pierwszej przegródki i umiemy dotrzeć do każdego elementu tablicy.
Adres możemy policzyć tak:

adres = numer_przegródki * rozmiar_pojedynczej_przegródki + adres_pierwszej_przegródki

Znając adres od razu trafiamy w odpowiednie miejsc.

To "od razu tam trafiamy" oznacza, że mamy "stały czas dostępu", czyli O(1) ;-)

Nie ważne czy chcemy się dostać do czegoś w tablicy co jest na początku, końcu czy w środku, zawsze trwa to tyle samo.

Sęk w tym, że choć tablica jest wspaniała to nie do wszystkiego się da jej użyć.

Jak mamy policzyć sumę jakichś liczb, to tablica działa świetnie. Przechodzimy element po elemencie i sumujemy.
Gdy mamy skopiować pliki to możemy sobie ich nazwy trzymać w tablicy i przesuwać się o jedne po tym jak skopiujemy poprzedni.

Tablicą jest też piętro w hotelu gdzie każdy pokój ma kolejny numer i ktoś na recepcji może łatwo powiedzieć, że w pokoju 300 mieszka X, a w 301 nikt.

Tablice działają ogólnie świetnie gdy mamy listę rzeczy i interesuje nas tylko ich kolejność, albo gdy kolejny numer dokładnie opisuje o co nam chodzi.
To drugie to przypadek z hotelem, albo lista zwycięzców biegu.

<Dygresja>
Żeby było zabawnie niektóre języki programowania zaczynają numerowanie elementów w tablicy zawsze od 0, niektóre zawsze od 1, a są jeszcze takie gdzie można samemu wyznaczyć zakresy.
Ale głównie zaczynają się od 0 albo 1.
Była propozycja by pogodzić te języki i wprowadzić kompromisowe rozwiązywanie i startować od 0.5, ale jakoś nie przeszła ;-)
</Dygresja>

Jednak nie wszystko da się opisać przez liczbę w prosty sposób.

Jak mamy listę imion i telefonów i chcemy móc znaleźć telefon którejś osoby bazując na imieniu to tablica się zbytnio nie nadaje.

Moglibyśmy w jednym miejscu trzymać tablicę z imionami i używać indeksu z tej tablicy by znaleźć numer.
Ale to by było wolne, w najgorszym przypadku musielibyśmy przeszukać całą tablicę imion by poznać indeks numeru ostatniej osoby w tablicy.

Moglibyśmy co prawda posortować imiona i wtedy moglibyśmy znaleźć imię o wiele szybciej, bo potrzebowalibyśmy mniej więcej log2(ilość_imion) prób stosując bisekcję**.
Ale da się szybciej.

Bo w końcu imię to tylko zbiór liter, a litery w komputerze są niczym innym jak liczbą***...

I gdyby tak użyć tej liczby jako indeksu w tablicy? Moglibyśmy od razu dotrzeć do odpowiedniego numeru...

Problem w tym, że te liczby byłyby bardzo duże. Ala to 6384705,  Przemek to 30229343036404304....
Nie ma tak dużych komputerów by móc zmieścić w nich tak dużą tablicę.

Ale pomysł sam w sobie nie jest zły. By zmienić to po czym szukamy, czyli klucz w liczbę.

Ale nadal te liczby są za duże...

A gdyby tak przyjąć, że niezależnie jak wielka liczba nam wyjdzie to dzielimy ją zawsze przez liczbę opisującą rozmiar tablicy jaką mamy i używać przegródki, która będzie wyrażona jako reszta z tego dzielenia?

Czyli co by się stało gdyby wziąć mniejszą tablicę, powiedzmy z 100 elementami, później wziąć zmienić imię na liczbę, podzielić tę liczbę przez 100 i użyć reszty z tego dzielenia jako numeru przegródki?

Ala, czyli 6384705 zmieniłaby się w numer przegródki 5, a Przemek 30229343036404304 w przegródkę 4...

Niby działa, mamy wspaniałą strukturę danych, która zmienia imiona w numerki i od razu pozwala nam dotrzeć do numerów :-)

Ale są problemy....
Np. numery Alicji i Ewy byłby oba w przegródce 25. Bo Alicja z 107109562281025 zmieniłaby się w 25, Ewa z 6387525 też zmieniłaby się w 25.
To dość logiczne, bo jednak chcemy zmienić większe liczby w mniejsze i siłą rzeczy co jakiś czas się zdarzą konflikty.

W takim przypadku mamy 2 rozwiązania.

Rozwiązanie 1 to sam sposób na rozwiązanie konfliktu.
Jest ich kilka, ja opiszę w miarę najprostszy, czyli metodę łańcuchową.
W momencie konfliktu zamiast zapisać w danym miejscu numer telefonu zapisujemy imię i numer telefonu, jeśli już tam jakieś imię i numer telefonu są to dopisujemy je za pierwszym.... Czyli w tablicy trzymamy drugą tablicę (tak naprawdę w tablicy wtedy trzymamy adresy do innych tablic...).

Czyli jak szukamy numery Ewy to idziemy do przegródki 25, a później idziemy przez tablicę numerów w tej przegródce aż znajdziemy Ewę.

Niby fajne, ale jak zbyt często się nam będą te konflikty zdarzały to cała nasza ciężka praca była niewiele warto bo nadal będzie wolno...

Moglibyśmy zwiększyć rozmiar tablicy której używamy, ale wtedy zużyjemy więcej pamięci...

Trzeba więc postarać się by ta liczba, którą produkujemy z imienia była bardziej "szalona" tak by istniała jak najmniejsza szansa konfliktu.
Bo jednak biorąc resztę z dzielenia z liczby bierzemy de facto tylko część jej "dołu".****

Tu pojawia się druga część nazwy naszej struktury, czyli tablicy haszującej. Funkcja haszująca ;-)

Po angielsku hash to między innymi siekanka ;-) Funkcja hashująca to funkcja która na wejściu dostaje coś, np. imię, a na wyjściu wypluwa siekankę. Wypluwa liczbę wyprodukowaną z tego co na wejściu, ale jak najbardziej posiekaną.
Fachowo to się nazywa, że funkcja hashująca powinna klucze ze swojej dziedziny równomiernie dystrybuować w swojej przeciwdziedzinie ;-) [i jak ktoś tego nie rozumie, to sorry w LO to było ;-)]
Dodatkowy wymóg jest taki by hash z tego samego wejścia był ZAWSZE taki sam.

Same funkcje hashujące są dość złożone i mają różne ciekawe właściwości. Używa się ich też WSZĘDZIE.
Bitcoin i cały blockchain bazują na funkcjach hashujących, sumy kontrolne też, sprawdzania poprawności plików, antywirusy i tak dalej.

Zwykle funkcja hashująca bierze bity tego czego liczymy hash i próbuje wprowadzić do nich w jakiś sposób coś co dobrze będzie udawało chaos.

W przypadku imienia może zmienić wszystkie literki w liczby, a następnie do pierwszej literki dodać drugą pomnożoną przez jakąś liczbę (najlepiej pierwszą), później pomnożyć to znów przez tą liczbę i dodać trzecią, pomnożyć i dodać czwartą i tak dalej... (tak to działa w Java'ie)

Mamy wtedy liczbę, która jest dość przypadkowa. Teraz dzieląc ją przez liczbę przegródek w naszej tablicy zmniejszamy szanse na konflikt. Nadal może się zdarzyć, ale rzadziej.

Tu oczywiście jest haczyk, ilość kombinacji silnie zależy od rozmiaru tablicy w której będziemy trzymali nasze dane.
Przy dobrych funkcjach hashujących okazuje się, że zwykle wystarczy niewielki "zapas" w tablicy by uniknąć nadmiaru konfliktów. 20-25% więcej miejsca w tablicy niż chcemy w niej przechowywać elementów zwykle zapewnia praktycznie zerową liczbę konfliktów.

I to są mniej więcej tablice hashujące ;-)

Czyli tablica + hash. Bierzemy nasz klucz, robimy na nim hash i tak znajdujemy miejsce gdzie schować wartość, albo gdzie jest nasza wartość...

OK, tu jest jeszcze jedna rzecz. Bo w przecież mamy konflikty. Konflikt wtedy gdy mamy więcej niż 1 rzecz w danym kawałku naszej tablicy, albo gdy mamy 1 rzecz, ale szukamy innej która akurat też wskazuje na ten sam kawałek tablicy...
Potrzebujemy jeszcze czegoś co sprawdzi czy to po co sięgamy do naszej tablicy hashującej jest tym czego szukamy.
Czyli potrzebujemy czegoś co stwierdzi równość ;-)

Tu wychodzi ciekawa sprawa, czyli to, że tablica hashująca do działania potrzebuje "kontraktu".
Kontrakt mówi, że jeśli 2 rzeczy są równe to ich hashe muszą być takie same.
Dodatkowo, choć o tym się już tak głośno nie mówi ;-) hash powinno się liczyć tylko z tych elementów klucza, które są niezmienne.

... miało być krótko ;-)

* - miał być krótki...
** - i moglibyśmy użyć tablicy, albo drzewa ;-)
*** - liczby w komputerze zapisane są w kolejnych bajtach, 1 w jednym bajcie, 257 już w 2, 2 miliony potrzebują już 3 bajtów.. literki też są liczbami, można więc Ala, czyli liczby 65, 108 i 97 potraktować jako kawałki większej liczby.... akurat tutaj tą liczbą by było 65+108*256+97*2562 czyli 6384705.
**** - OK, to jest trochę trudniejsze i nie umiem tego dobrze wytłumaczyć. Załóżmy, że nie mamy 100 elementów w naszej tablicy, a dokładnie 256 sztuk. Czyli liczbę która nam wyjdzie z przeliczenia imienia dzielimy przez 256 i bierzemy resztę.
Wtedy Ala to 6384705, a reszta z dzielenia przez 256 to 65. Anna to 1634627137, ale reszta z dzielenia przez 256 to też 65.
W końcu nasza liczba to litera[0]+litera[1]*256+...+litera[długość_imienia-1]*256długość_imienia-1, a to podzielone z resztą daje resztę równą litera[0].... czyli nasz indeks jest w takim przypadku równy zawsze pierwszej literze... Szanse na konflikt mamy dość duże, szczególnie że mamy tylko 26 liter w alfabecie ;-)
Dzieląc przez 100 trochę się przed tym zabezpieczamy, ale nadal mało, bo nadal ignorujemy dużą część informacji zapisanej w imieniu.


Podobne postybeta
Jak czytać kod...
Moc wykresu.... Czyli jak wieść szczęśliwsze życie ;-)
Referencje w Java'ie
Distinct (albo unique) w JavaScript
+2 czy +6?

wtorek, listopada 21, 2017

Nerdopolis ;-)

Dziś media informowały o odkryciu Oumuamua, czyli najpewniej pozasłonecznego obiektu (czy bardziej międzygwiezdnego obiektu), który wszedł do naszego Układu Słonecznego z prędkością 95 tysięcy km/h.
Moja pierwsza myśl jak to dziś rano przeczytałem to było "Rama!" jak w Spotkaniu z Ramą Arthura C. Clarke'a, druga to to, że jak dojdzie do peryhelium to jeśli zacznie zmieniać orbitę to będzie na 100% statek ;-)
Później doczytałem, że już przeszła peryhelium i zauważyli drania dopiero po tym przejściu....

Ale co ciekawe, u nas w firmie na Slacku general, na którym piszą ludzie z wszystkich lokacji pojawiło się wile nawiązań właśnie do Ramy albo do Ringworlda ;-)

Firma gdzie jest dużo programistów to jest jednak Nerdopolis ;-)


Podobne postybeta
Rama... coś nie działa ;-)
Tarcza
Rok Darwina czas zacząć :-)
Dream job? ;-)
Spryciarz z Londynu i kilka uwag o tłumaczeniu