日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
簡(jiǎn)述用C#實(shí)現(xiàn)優(yōu)先隊(duì)列方法

優(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# 語(yǔ)言寫一個(gè),如下所示:

站在用戶的角度思考問題,與客戶深入溝通,找到陵川網(wǎng)站設(shè)計(jì)與陵川網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋陵川地區(qū)。

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)、如何對(duì)鍵進(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ì)列,請(qǐng)參見我的博客 Timus1016. A Cube on the Walk 。雖然更簡(jiǎn)單,程序代碼只有 23 行,但是效率不高,其 Push 和 Pop 方法的時(shí)間復(fù)雜度都是 O(N)。

【編輯推薦】

  1. 詳解C#編程中的反射機(jī)制與方法
  2. C#中使用擴(kuò)展方法對(duì)調(diào)用進(jìn)行驗(yàn)證
  3. 詳解C#代碼文件生成擴(kuò)展代碼文件

分享題目:簡(jiǎn)述用C#實(shí)現(xiàn)優(yōu)先隊(duì)列方法
分享路徑:http://www.dlmjj.cn/article/dpiehjj.html