自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

簡述用C#實(shí)現(xiàn)優(yōu)先隊(duì)列方法

開發(fā) 后端
在微軟的.NET Framework的類中,并沒有如同Java等其他語言所有的PriorityQueue類,也就是優(yōu)先隊(duì)列類。那么作者通過C#實(shí)現(xiàn)了這一方法,在這里與大家共同探討。

優(yōu)先隊(duì)列(priority queue) 是很重要的數(shù)據(jù)結(jié)構(gòu)。我在做 ACM 題時(shí)就經(jīng)常要用到她。C++ STL 就包括 priority_queue 。Java 也有 PriorityQueue 類。遺憾的是,.NET Framework Base Class Library 中并不包括優(yōu)先隊(duì)列。于是,我只好自己用 C# 語言寫一個(gè),如下所示:

using System;
using System.Collections.Generic;

namespace Skyiv.Util
{
class PriorityQueue
  {
    IComparer comparer;
    T[] heap;

public int Count { get; private set; }

    public PriorityQueue() : this(null) { }
    public PriorityQueue(int capacity) : this(capacity, null) { }
    public PriorityQueue(IComparer comparer) : this(16, comparer) { }

    public PriorityQueue(int capacity, IComparer comparer)
    {
      this.comparer = (comparer == null) ? Comparer.Default : comparer;
      this.heap = new T[capacity];
    }

    public void Push(T v)
    {
      if (Count >= heap.Length) Array.Resize(ref heap, Count * 2);
      heap[Count] = v;
      SiftUp(Count++);
    }

    public T Pop()
    {
      var v = Top();
      heap[0] = heap[--Count];
      if (Count > 0) SiftDown(0);
      return v;
    }

    public T Top()
    {
      if (Count > 0) return heap[0];
      throw new InvalidOperationException("優(yōu)先隊(duì)列為空");
    }

    void SiftUp(int n)
    {
      var v = heap[n];
      for (var n2 = n / 2; n > 0 && comparer.Compare(v, heap[n2]) > 0; n = n2, n2 /= 2)

heap[n] = heap[n2];
      heap[n] = v;
    }

    void SiftDown(int n)
    {
      var v = heap[n];
      for (var n2 = n * 2; n2 < Count; n = n2, n2 *= 2)
      {
        if (n2 + 1 < Count && comparer.Compare(heap[n2 + 1], heap[n2]) > 0) n2++;
        if (comparer.Compare(v, heap[n2]) >= 0) break;
        heap[n] = heap[n2];
      }
      heap[n] = v;
    }
  }
}

如上所示,這個(gè) PriorityQueue 泛型類提供四個(gè)公共構(gòu)造函數(shù),第一個(gè)是無參的構(gòu)造函數(shù),其余的構(gòu)造函數(shù)允許指定優(yōu)先隊(duì)列中包括的初始元素?cái)?shù)(capacity)、如何對鍵進(jìn)行比較(comparer)。

這個(gè)程序使用堆(heap)來實(shí)現(xiàn)優(yōu)先隊(duì)列。所以,所需的空間是最小的。Count 屬性和 Top 方法的時(shí)間復(fù)雜度是 O(1),Push 和 Pop 方法的時(shí)間復(fù)雜度都是 O(logN)。

我曾經(jīng)用 List 泛型類實(shí)現(xiàn)過一個(gè)優(yōu)先隊(duì)列,請參見我的博客 Timus1016. A Cube on the Walk 。雖然更簡單,程序代碼只有 23 行,但是效率不高,其 Push 和 Pop 方法的時(shí)間復(fù)雜度都是 O(N)。

【編輯推薦】

  1. 詳解C#編程中的反射機(jī)制與方法
  2. C#中使用擴(kuò)展方法對調(diào)用進(jìn)行驗(yàn)證
  3. 詳解C#代碼文件生成擴(kuò)展代碼文件
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2009-08-19 17:00:07

C#實(shí)現(xiàn)PrintPa

2009-08-20 14:22:17

C#實(shí)現(xiàn) Contro

2009-09-09 14:20:18

C# XML解析XML解析方法

2009-08-26 09:26:12

C#語言層次劃分

2022-08-11 08:03:43

隊(duì)列

2021-03-26 05:54:00

C#數(shù)據(jù)方法

2021-06-10 00:13:43

C#隊(duì)列數(shù)據(jù)

2009-09-07 09:36:29

C# DisposeDispose方法

2009-09-11 11:39:23

C# RadioBut

2011-05-23 17:00:29

2009-08-28 17:10:59

C#線程優(yōu)先級

2021-03-27 11:02:04

JavaScript隊(duì)列編程語言

2009-09-02 18:53:28

C#鼠標(biāo)坐標(biāo)

2009-08-25 14:26:28

C#播放AVI文件

2009-09-10 17:37:01

C# get post

2009-09-10 18:06:25

C# button快捷

2024-05-16 12:33:37

C#編程指針

2009-08-26 18:11:52

前臺與后臺方法互調(diào)

2011-12-02 10:58:06

數(shù)據(jù)結(jié)構(gòu)Java

2009-08-17 17:40:53

C# GetAllCu
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號