Hoppa till innehåll

Beläggningsgrad, resizing och prestanda

↑

Beläggningsgrad är ofta antal / antalBuckets vid chaining eller upptagna platser / kapacitet vid open addressing. När beläggningen ökar kan kollisionerna ta mer tid. Resizing skapar en större array och hashar om posterna eftersom modulus ändras. Ett enskilt bygge kan ta O(n), men med geometrisk kapacitetsökning blir många insättningar ofta amorterat O(1).

Hashkoder måste följa regeln: om Equals(a,b) är sann måste samma hashfunktion ge samma hashkod. Olika nycklar får kollidera. Använd stabila likhetsfält för nycklar och förlita dig inte på att hashkoder är identiska mellan .NET-processer eller versioner.

C# | Example.cs
using System;
using System.Collections.Generic;
var names = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
names.Add("ALICE");
Console.WriteLine(names.Contains("alice")); // True
// Choose the comparer at collection creation time, not per lookup.

Prestanda: Skilj mellan genomsnitt, förväntad, amorterad och värsta fall. Med svåra kollisioner kan ett uppslag bli linjärt i antalet nycklar. Öva: Ändra bucketantal från 5 till 7 i simulatorn och se hur alla ID:n flyttas.

Interaktiv hashtabell · HashSet och Dictionary

Språkskillnad: StringComparer.OrdinalIgnoreCase gör C#-uppslagningen skiftlägesokänslig. std::unordered_set<std::string> i C++ är normalt skiftlägeskänslig och behöver egna matchande hash- och likhetsfunktioner för samma beteende.