.NET HashTable Vs žodynas - ar žodynas gali būti toks pat greitas?

Bandau išsiaiškinti, kada ir kodėl naudoti žodyną ar „HashTable“. Aš šiek tiek dirbau ieškodamas ir nustatiau, kad žmonės kalba apie bendruosius žodyno privalumus, su kuriais aš visiškai sutinku, o tai lemia bokso ir išpakavimo pranašumą dėl nedidelio produktyvumo padidėjimo.

Bet aš taip pat perskaičiuoju žodyną, kuris ne visada grąžins daiktus tokia tvarka, kuria jie įterpiami, tai, ką ji rūšiuoja. Kur, kaip HashTable, bus. Kaip suprantu, tai lemia tai, kad HashTable kai kuriose situacijose yra daug greičiau.

Mano klausimas yra iš tikrųjų, kokios galėtų būti tokios situacijos? Ar aš tiesiog klystu pirmiau minėtose prielaidose? Kokiose situacijose galite pasirinkti vieną iš kitų (taip, paskutinis yra šiek tiek dviprasmiškas).

232
06 июля '09 в 23:46 2009-07-06 23:46 Jonas paklausė liepos 06 d., 09:46, 2009-07-06 23:46
@ 9 atsakymai
Klasės

System.Collections.Generic.Dictionary<TKey, TValue> ir System.Collections.Hashtable palaiko vidaus duomenų struktūros maišos lentelę. Nė vienas iš jų negarantuoja elementų tvarkymo.

Vengiant bokso / išpakavimo problemų, daugeliu atvejų jie turėtų būti labai panašūs.

Pagrindinis struktūrinis skirtumas tarp šių dviejų dalykų yra tas, kad Dictionary remiasi grandine (išlaikant kiekvieno maišos lentelės elementų sąrašą), siekiant išspręsti konfliktus, o Hashtable naudoja pakartotinį apdorojimą konfliktų sprendimui (kai susidaro susidūrimas, kita maišos funkcija bando suderinti raktą su kibiras).

Naudojant „.NET Framework 2.0+“, „ Hashtable klasės naudojimui yra keletas privalumų. Tai iš tikrųjų pasenęs Dictionary<TKey, TValue> .

260
06 июля '09 в 23:47 2009-07-06 23:47 atsakymą pateikė Mehrdad Afshari liepos 06 d., 09:47, 2009-07-06 23:47

Manau, kad tai jums nieko nereiškia. Tačiau tik norint sužinoti, ar žmonės gyvena

„Performance Test“ - „SortedList“ ir „SortedDictionary vs. Žodynas vs Hashtable

92
17 окт. Abdul Munim atsakymas, pateiktas spalio 17 d 2010-10-17 00:07 '10, 00:07 2010-10-17 00:07

Kitas svarbus skirtumas yra tas, kad „Hashtable“ tipas palaiko kelių skaitytojų ir vieno autoriaus blokavimą vienu metu, o žodynas nėra.

22
14 марта '10 в 19:45 2010-03-14 19:45 atsakė Stevene „Kovo 14 d.“, 19:45, 2010-03-14 19:45

„Hashtable“ ir žodyno skirtumai

Žodynas:

  • Žodynas grąžina klaidą, jei stengiamės rasti raktą, kurio nėra.
  • Žodynas yra greitesnis nei Hashtable, nes nėra bokso ir išpakavimo.
  • Žodynas yra bendro pobūdžio, o tai reiškia, kad galime jį naudoti bet kokio tipo duomenimis.

Hashtable:

  • Hashtable grąžina nulį, jei bandome rasti raktą, kurio nėra.
  • Hashtable yra lėtesnis nei žodynas, nes tam reikia bokso ir išpakavimo.
  • Hashtable nėra bendro pobūdžio.
16
09 дек. atsakymą pateikė vartotojo2771704 09 dec. 2014-12-09 16:38 '14, 16:38 2014-12-09 16:38

MSDN straipsnis: " Dictionary<TKey, TValue> klasė turi tą patį kaip Hashtable klasė. Dictionary<TKey, TValue> tikro tipo (išskyrus Object ) turi geresnių rezultatų nei Hashtable vertės tipams, nes Hashtable elementai yra Object tipo ir taigi, boksas ir išpakavimas paprastai atsiranda, jei saugomi arba atsiunčiami vertės tipai. "

Nuoroda: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx

14
24 июля '12 в 0:55 2012-07-24 00:55 atsakymą pateikė Juan Camilo Caro J. liepos 24 d., 12 val. 0:55 2012-07-24 00:55

Abi iš tiesų yra tos pačios klasės (galite peržiūrėti išardymą). „HashTable“ buvo sukurtas prieš .Net turėjo generinių vaistų. Tačiau žodynas yra bendroji klasė ir suteikia jums stiprią raštą. Aš niekada nenaudosiu „HashTable“, nes žodynas jums nieko nenaudojo.

11
06 июля '09 в 23:50 2009-07-06 23:50 atsakymą pateikė Adam Luter liepos 06 d., 09:50, 2009-07-06 23:50

Kitas svarbus skirtumas yra tas, kad Hashtable yra sriegis saugus. Hashtable turi įmontuotą sriegio / skaitytuvo / vieno rašymo (MR / SW) apsaugą, o tai reiškia, kad „ Hashtable leidžia vienam autoriui kartu su keliais blokuojančiais skaitytuvais. Kalbant apie Dictionary nėra srieginio saugumo, jei reikia sriegio saugumo, turite įdiegti savo sinchronizavimą.

Toliau paaiškinkite:

Hashtable užtikrina tam tikrą sriegių saugą per sinchronizuotą funkciją, kuri grįžta į saugų įvyniojimą aplink kolekciją. Apvyniojimas blokuoja visą kolekciją kiekvienai papildymo ar ištrynimo operacijai. Todėl kiekvienas sriegis, bandantis pasiekti kolekciją, turi palaukti, kol jo ruožas užfiksuos vieną bloką. Jis nėra keičiamo dydžio ir gali lemti didelį didelių kolekcijų našumo sumažėjimą. Be to, dizainas nėra visiškai apsaugotas nuo rasės sąlygų.

.NET Framework 2.0 rinkinio klasės, pvz., List<T> , Dictionary<TKey, TValue> ir kt., Dictionary<TKey, TValue> jokio srauto sinchronizavimo; Naudotojo kodas turi suteikti visą sinchronizavimą, kai elementai yra pridedami arba pašalinami vienu metu keliose temose, jei jums reikia saugos, taip pat ir sriegių saugos, naudokite lygiagrečias rinkimo klases .NET Framework. Toliau skaitykite čia.

5
12 нояб. atsakymas pateikiamas rugpjūčio mėn . NullReference 12 nov. 2015-11-12 18:11 '15, 18:11 2015-11-12 18:11

Jei jums rūpi skaitymas, kuris visada grąžins objektus tokia tvarka, kuria jie įterpiami į žodyną, galite ieškoti

OrderedDictionary - prieigą prie reikšmių galima gauti naudojant sveikojo skaičiaus indeksą (ta tvarka, kuria buvo pridėti elementai) RūšiuotiDictionary - elementai yra automatiškai surūšiuoti

1
23 окт. atsakymas pateikiamas ToXinE 23 okt. 2013-10-23 11:01 '13, 11:01 2013-10-23 11:01

Žodynas yra greitesnis nei maišos lentelė, nes žodynas yra bendras stiprus tipas. Hashtable yra lėtesnis, nes objektas priima objektą kaip duomenų tipą, kuris sukelia bokso ir dekompresijos.

-2
15 марта '12 в 9:24 2012-03-15 09:24 atsakymą pateikė jitendra mahaapatro kovo 15 d., 12 val. 9:24 am 2012-03-15 09:24

Kiti klausimai apie žymių arba Ask a question