成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開(kāi)發(fā) 后端
在微軟的.NET Framework的類中,并沒(méi)有如同Java等其他語(yǔ)言所有的PriorityQueue類,也就是優(yōu)先隊(duì)列類。那么作者通過(guò)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# 語(yǔ)言寫(xiě)一個(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è)是無(wú)參的構(gòu)造函數(shù),其余的構(gòu)造函數(shù)允許指定優(yōu)先隊(duì)列中包括的初始元素?cái)?shù)(capacity)、如何對(duì)鍵進(jìn)行比較(comparer)。

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

我曾經(jīng)用 List 泛型類實(shí)現(xiàn)過(guò)一個(gè)優(yōu)先隊(duì)列,請(qǐng)參見(jiàn)我的博客 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ò)展代碼文件
責(zé)任編輯:彭凡 來(lái)源: 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#語(yǔ)言層次劃分

2022-08-11 08:03:43

隊(duì)列

2009-09-11 11:39:23

C# RadioBut

2009-09-07 09:36:29

C# DisposeDispose方法

2021-03-26 05:54:00

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

2021-06-10 00:13:43

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

2011-05-23 17:00:29

2009-08-28 17:10:59

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

2021-03-27 11:02:04

JavaScript隊(duì)列編程語(yǔ)言

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

2024-05-16 12:33:37

C#編程指針

2009-09-10 18:06:25

C# button快捷

2009-08-26 18:11:52

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

2009-08-26 17:16:22

C# CheckSta

2009-08-17 17:40:53

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

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

主站蜘蛛池模板: 色婷婷综合网站 | 91中文字幕 | 久久久www成人免费无遮挡大片 | 又黄又爽的网站 | 黄色a视频 | 成人av免费 | 狠狠亚洲 | 在线成人一区 | 在线区| 在线看片国产精品 | 国产精品亚洲成在人线 | 亚洲男女视频在线观看 | 播放一级毛片 | 国产黄色小视频 | 国内自拍偷拍 | 一级免费毛片 | 97伦理电影网 | 中文字幕亚洲精品 | 在线观看av不卡 | 国产成人精品一区二区在线 | 成人精品鲁一区一区二区 | 日日夜夜草 | 久久九精品 | www精品美女久久久tv | 国产欧美日韩久久久 | 日韩电影免费观看中文字幕 | 精品影院 | 日韩一区二区三区在线视频 | 国产人免费人成免费视频 | 日韩成人免费av | 久久精品国产亚洲一区二区 | 欧美aⅴ | 中文字幕亚洲区 | 国产黄色网址在线观看 | 91亚洲精品在线观看 | 色网站入口 | 精品视频在线观看 | 天天狠狠 | 午夜a级理论片915影院 | 麻豆视频在线看 | 国产剧情一区二区三区 |