Myślę, że pierwszą rzeczą do rozważenia jest obsługiwana operacja?
Czy „wstawienie wartości z określonym, stałym kluczem” (np. Dla kluczy pobranych z dziedziny liczb całkowitych, wstawienie z kluczem = 3) odpowiada obsługiwanej operacji dla stosu min?
Nie, ponieważ operację tę można w prosty sposób zaimplementować za pomocą bardziej ogólnych obsługiwanych operacji. Podobnie wstawianie 2 elementów jednocześnie można wykonać za pomocą istniejącej insert
operacji.
Z drugiej strony insert
operacji nie można zdefiniować inaczej niż poprzez ujawnienie szczegółów implementacji. Podobnie jest z operacjami wymienionymi na stronie wikipedii, z heapify
wyjątkiem, które prawdopodobnie mogłyby być zaimplementowane przez sekwencję insert
.
Innymi słowy, istnieją podstawowe operacje na typie, które są ściśle związane ze szczegółami implementacji, aby mogły dobrze działać, i są inne operacje, które nie przestrzegają tej reguły, a zatem mogą być realizowane jako kombinacje kanonicznych.
Mając na uwadze tę definicję, czy sądzisz, że klawisz zwiększenia można wdrożyć wyłącznie z innymi obsługiwanymi operacjami, bez utraty wydajności? Jeśli tak, to nie jest to obsługiwana operacja według powyższej definicji, w przeciwnym razie możesz mieć rację.
O ile mi wiadomo, definicja obsługiwanej przeze mnie operacji jest moja. Nie jest to formalne i dlatego podlega dyskusji (choć wydaje mi się dość jasne). Byłbym jednak zadowolony, gdyby ktoś mógł dostarczyć źródło, które jasno i jednoznacznie definiuje, czym jest obsługiwana operacja dla typów danych, lub przynajmniej definiuje ją lepiej niż moje (czy ta definicja jest podana w CLR? Nie mam kopii ).
Moja druga uwaga dotyczy sposobu definiowania kolejki priorytetowej (która jest racją bytu składów binarnych). Czy increase_key
operacja jest niezbędna dla tego typu danych, tj. Do jego właściwego wykorzystania?
Jak widać, mój kąt dotyczy definicji. Naprawdę nie udzielam odpowiedzi na twoje pytania, a jedynie niektóre wskazówki, więc ulepszenia są mile widziane.