主頁 > 區塊鏈 > 【資料結構Python描述】優先級佇列簡介及Python手工實作

【資料結構Python描述】優先級佇列簡介及Python手工實作

2020-09-30 13:46:38 區塊鏈

文章目錄

  • 一、優先級佇列簡介
    • 1. 簡介
    • 2. 定義
    • 3. ADT
  • 二、優先級佇列實作
    • 1. 佇列記錄的鍵值對保存
    • 2. 定義優先級佇列的基類
    • 3. 使用未排序位置串列實作
      • `__init__()`
      • `_find_min()`
      • `__len__()`
      • `add()`
      • `min()`
      • `remove_min()`
    • 4. 使用排序位置串列實作
      • `__init__()`
      • `__len__()`
      • `add()`
      • `min()`
      • `remove_min()`
    • 5. 比較兩種基于位置串列的實作
  • 三、附錄:完整代碼測驗

一、優先級佇列簡介

1. 簡介

在文章【資料結構Python描述】佇列和雙端佇列簡介及其高效率版本Python實作中,我們引入并實作了佇列這種資料結構,對其進行元素的增刪遵循先進先出的原則,并以現實中排隊享受服務作為類比,

然而,上述普通佇列的模型并不能完全滿足實際的需求,例如:你僅是某銀行的普通等級客戶,當你去銀行取號辦理業務時,可能雖然后面的人來得比你晚,但是由于他可能是該行的白金等級客戶,那么很有可能他會在你之前被叫號,

因此,對于上述情況,取號的早晚并不會被當作判斷下一個被叫號的唯一標準,更重要是看客戶的等級,本文就將介紹并實作用以描述這類場景的資料結構——優先級佇列,實際上,在上述案例中,客戶等級就是優先級

2. 定義

優先級佇列:優先級佇列是指這樣一種抽象資料型別,即其中包含一系列具有不同優先級的元素,除了像普通佇列可以在隊尾插入元素外,優先級佇列可以在任意位置插入元素,最重要的是在每次從優先級佇列中移除的元素都具有最高的優先級

對于優先級佇列,在向其中插入一個元素時,用戶就會同時以的形式為其指定一個優先級,而鍵值最小的元素會在下一次元素出隊操作時被從優先級佇列中移除,例如:如果元素鍵值為1的優先級要高于元素鍵值為2的元素,

需要注意的是,盡管通常元素的優先級即鍵都用整數來表示,但原則上任意兩個通過同一個類實體化后得到的Python物件ab,只要對于a < b運算有一致的含義,則這些物件都可以作為代表元素優先級的鍵,

3. ADT

為了后續實作優先級佇列,這里將一個元素和其優先級表示為一個鍵值對的形式,而且在本文實作的優先級佇列ADT包含以下幾個方法:

  • p.add(k, v):將鍵k和表示元素的值v作為一個記錄插入優先級佇列p中;
  • p.min():回傳一個元組(k, v)kv分別代表優先級佇列p中一條記錄的鍵和值;
  • p.remove_min():將優先級佇列p中鍵值k最小的記錄洗掉并回傳一個元組(k, v),如果此時p為空則拋出例外;
  • p.is_empty():如果優先級佇列p不包含任何記錄則回傳True
  • __len__():回傳優先級佇列p中記錄條目數,

需要注意的是,一個優先級佇列中的多條記錄可能會有相同的鍵,在這種情況下min()remove_min()兩個方法將會隨機回傳有最小鍵那條記錄的元素,

下面是使用上述ADT中的方法對一個優先級佇列進行一系列操作后預期的結果:

操作回傳值優先級佇列
p.add(5, A)None{(5, A)}
p.add(9, C)None{(5, A), (9, C)}
p.add(3, B)None{(3, B), (5, A), (9, C)}
p.add(7, D)None{(3, B), (5, A), (7, D), (9, C)}
p.min()(3, B){(3, B), (5, A), (7, D), (9, C)}
p.remove_min()(3, B){(5, A), (7, D), (9, C)}
p.remove_min()(5, A){(7, D), (9, C)}
len(p)2{(7, D), (9, C)}
p.remove_min()(7, D){(9, C)}
p.remove_min()(9, C){}
p.is_empty()True{}

二、優先級佇列實作

本節將使用【資料結構Python描述】位置串列簡介與Python版手工實作中的位置串列存盤優先級佇列中以鍵值對形式存盤的每條記錄,并且,基于佇列中的記錄是否按照鍵排序,下面提供兩種實作方式,

1. 佇列記錄的鍵值對保存

對于優先級佇列的實作,首先需要考慮的是如何保存優先級佇列一條記錄中的鍵k和值v,實際上,早在之前實作單鏈表時,我們就遇到過類似情況,即單鏈表的每一個結點也需要參考兩個物件,即:業務物件元素和下一個結點,

這里考慮仿照單鏈表實作中定義的結點類_Node定義一個_Item類,其實體屬性key參考一條記錄的鍵,實體屬性value參考同一條記錄的值,不同的是,在優先級佇列的實作類中嵌套定義類_Item

2. 定義優先級佇列的基類

實際上,由于后續我們將根據優先級佇列中的記錄是否按照鍵的大小進行排序提供兩種不同實作,因此為提高代碼復用程度并建立不同實作之間的聯系,下面仿照樹的實作先定義一個包含兩種實作共有方法的抽象基類PriorityQueueBase

from abc import ABCMeta, abstractmethod


class PriorityQueueBase(metaclass=ABCMeta):
    """優先級佇列的基類"""

    class _Item:
        """用于表示優先級佇列中以鍵值對形式保存的記錄條目類"""

        def __init__(self, k, v):
            self.key = k
            self.value = v

        def __lt__(self, other):
            """
            多載運算子<,使得可按照兩個_Item實體物件的屬性key來比較這兩個實體物件
            :param other: _Item的另一個實體物件
            :return: Boolean
            """
            return self.key < other.key

    @abstractmethod
    def __len__(self):
        """
        具體子類中需實作的抽象方法,用于具體子類的實體物件支持len(obj)語法
        :return: 物件記錄條目數
        """
    
    @abstractmethod
    def add(self, key, value):
        """
        具體子類中需實作的抽象方法,用于向優先級佇列中插入一條包含鍵和值的記錄
        :param key: 鍵
        :param value: 值
        :return: None
        """
        
    @abstractmethod
    def min(self):
        """
        具體子類中需實作的抽象方法,用于回傳(但不洗掉)優先級佇列中鍵最小的記錄
        :return: 優先級佇列中鍵最小的記錄
        """
        
    @abstractmethod
    def remove_min(self):
        """
        具體子類中需實作的抽象方法,用于回傳并洗掉優先級佇列中鍵最小的記錄
        :return: 優先級佇列中鍵最小的記錄
        """

    def is_empty(self):
        """判斷優先級佇列是否為空"""
        return len(self) == 0

需要注意的是:

  • 關于抽象基類的定義方式可見Python中的繼承、抽象基類和介面;
  • 關于使用抽象基類的意義,可見【資料結構Python描述】樹的簡介、基本概念和手動實作一個二叉樹(真·全網最全!)

3. 使用未排序位置串列實作

下面給出繼承抽象基類PriorityQueueBase實作的第一個優先級佇列UnsortedPriorityQueue,其中的所有鍵值對記錄均保存在【資料結構Python描述】位置串列簡介與Python版手工實作中實作的位置串列PositionalList中,且每次向佇列中添加一條記錄時直接向隊尾添加

__init__()

首先,對于初始化方法,由于優先級佇列的使用者無需關心底層實作,因此這里將用于存盤優先級佇列記錄的實體屬性_data定義為非公有的且參考一個位置串列的實體物件:

def __init__(self):
    """創建一個空的優先級佇列,其記錄底層由位置串列保存"""
    self._data = PositionalList()

_find_min()

由于min()remove_min()兩個方法均需要先找到佇列中鍵最小的那條記錄,因此為提高代碼復用程度,這里定義這樣一個非公有方法,該方法回傳佇列中鍵最小記錄所在位置:

def _find_min(self):
    """查找并回傳優先級佇列中鍵最小的記錄,并回傳其在位置串列中的位置"""
    if self.is_empty():
        raise Empty('當前優先級佇列為空!')
    small = self._data.first()
    walk = self._data.after(small)
    while walk is not None:
        if walk.element() < small.element():
            small = walk
        walk = self._data.after(walk)
    return small

__len__()

該方法只需直接回傳呼層位置串列容器的元素個數:

def __len__(self):
    """支持實體物件使用len(obj)語法回傳obj長度的方法"""
    return len(self._data)

add()

該方法只需:

  • 先將鍵值對key-value封裝為_Item的一個實體;
  • 然后呼叫add_last()方法將該條記錄插入位置串列中即可:
def add(self, key, value):
    """將鍵值對key-value封裝為一條記錄插入位置串列最后位置"""
    self._data.add_last(self._Item(key, value))

min()

該方法只需:

  • 先呼叫實用方法_find_min()得到鍵最小記錄的位置;
  • 得到并回傳該位置處記錄中的鍵和值:
def min(self):
    """回傳(但不洗掉)優先級佇列中鍵最小的記錄"""
    p = self._find_min()
    item = p.element()
    return item.key, item.value

remove_min()

實作類似min(),只是在回傳鍵最小記錄的鍵和值之前要洗掉該條記錄:

def remove_min(self):
    """回傳并洗掉優先級佇列中鍵最小的記錄"""
    p = self._find_min()
    item = self._data.delete(p)
    return item.key, item.value

4. 使用排序位置串列實作

下面給出繼承抽象基類PriorityQueueBase實作的第二個優先級佇列SortedPriorityQueue,其中的所有鍵值對記錄也均保存在【資料結構Python描述】位置串列簡介與Python版手工實作中實作的位置串列PositionalList中,但與上述實作每次向佇列中添加一條記錄時都直接向隊尾添加不同的是,下面的實作中每次添加記錄的操作完成后都確保該記錄插入后佇列中記錄按鍵的大小升序排列

__init__()

實作同上述UnsortedPriorityQueue中的同名方法:

def __init__(self):
    """創建一個空的優先級佇列,其所有記錄在底層由位置串列保存"""
    self._data = PositionalList()

__len__()

實作同上述UnsortedPriorityQueue中的同名方法:

def __len__(self):
    """支持優先級佇列實體物件使用len(obj)語法回傳obj長度的方法"""
    return len(self._data)

add()

同上述UnsortedPriorityQueue中的同名方法實作不同的是,這里在向優先級佇列插入一條鍵值對形式的記錄后都保證所有記錄是按照鍵大小從左到右升序排列

def add(self, key, value):
    """將鍵值對key-value封裝為一條記錄插入位置串列,保證該記錄插入后佇列中記錄按鍵的大小升序排列"""
    item = self._Item(key, value)  # 根據鍵值對key-value創建一條記錄
    walk = self._data.last()  # 將輔助指標初始化為參考當前佇列最后一條記錄
    while walk is not None and item < walk.element():  # 遍歷佇列,保證該記錄插入后佇列中記錄按鍵的大小升序排列
        walk = self._data.before(walk)
    if walk is None:  # 如果新記錄的鍵小于當前佇列所有鍵,則在佇列頭部插入記錄
        self._data.add_first(item)
    else:  # 否則在輔助指標參考的記錄后插入記錄
        self._data.add_after(walk, item)

min()

實作類似上述UnsortedPriorityQueue中的同名方法:

def min(self):
    """回傳(但不洗掉)優先級佇列中鍵最小的記錄"""
    if self.is_empty():
        raise Empty('當前優先級佇列為空!')
    p = self._data.first()
    item = p.element()
    return item.key, item.value

remove_min()

實作類似上述UnsortedPriorityQueue中的同名方法:

def remove_min(self):
    """回傳并洗掉優先級佇列中鍵最小的記錄"""
    if self.is_empty():
        raise Empty('當前優先級佇列為空!')
    item = self._data.delete(self._data.first())
    return item.key, item.value

5. 比較兩種基于位置串列的實作

對于上述兩種不同的優先級佇列實作,其ADT方法的時間復雜度對比如下表所示:

方法UnsortedPriorityQueueSortedPriorityQueue
__len__ O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1)
is_empty O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1)
add O ( 1 ) O(1) O(1) O ( n ) O(n) O(n)
min O ( n ) O(n) O(n) O ( 1 ) O(1) O(1)
remove_min O ( n ) O(n) O(n) O ( 1 ) O(1) O(1)

上述時間復雜度分析成立的前提是:用于存盤優先級佇列記錄的位置串列底層使用雙向鏈表實作,

三、附錄:完整代碼測驗

下面是對上述實作的UnsortedPriorityQueueSortedPriorityQueue中的ADT方法進行測驗的完整代碼:

from abc import ABCMeta, abstractmethod
from positional_list import PositionalList


class Empty(Exception):
    """嘗試對空優先級佇列進行洗掉操作時拋出的例外"""
    pass


class PriorityQueueBase(metaclass=ABCMeta):
    """優先級佇列的基類"""

    class _Item:
        """用于表示優先級佇列中一條記錄的類"""

        def __init__(self, k, v):
            self.key = k
            self.value = v

        def __lt__(self, other):
            """
            多載運算子<,使得可按照兩個_Item實體物件的屬性key來比較這兩個實體物件
            :param other: _Item的另一個實體物件
            :return: Boolean
            """
            return self.key < other.key

    @abstractmethod
    def __iter__(self):
        """具體子類中需實作的抽象方法,用于生成優先級佇列中所有記錄的一個迭代"""

    @abstractmethod
    def __len__(self):
        """
        具體子類中需實作的抽象方法,用于具體子類的實體物件支持len(obj)語法
        :return: 物件記錄條目數
        """

    @abstractmethod
    def add(self, key, value):
        """
        具體子類中需實作的抽象方法,用于向優先級佇列中插入一條包含鍵和值的記錄
        :param key: 鍵
        :param value: 值
        :return: None
        """

    @abstractmethod
    def min(self):
        """
        具體子類中需實作的抽象方法,用于回傳(但不洗掉)優先級佇列中鍵最小的記錄
        :return: 優先級佇列中鍵最小的記錄
        """

    @abstractmethod
    def remove_min(self):
        """
        具體子類中需實作的抽象方法,用于回傳并洗掉優先級佇列中鍵最小的記錄
        :return: 優先級佇列中鍵最小的記錄
        """

    def __str__(self):
        """
        回傳物件的字串表示形式,使得可以使用print(obj)語法列印物件obj得到直觀的字串
        :return: 物件的字串表示形式
        """
        return str(list(self))

    def is_empty(self):
        """判斷優先級佇列是否為空"""
        return len(self) == 0


class UnsortedPriorityQueue(PriorityQueueBase):
    """記錄不按鍵的大小排序的優先級佇列具體實作類"""

    def __init__(self):
        """創建一個空的優先級佇列,其所有記錄在底層由位置串列保存"""
        self._data = PositionalList()

    def __iter__(self):
        """生成優先級佇列中所有記錄的一個迭代"""
        cursor = self._data.first()
        while cursor is not None:
            item = cursor.element()
            yield item.key, item.value
            cursor = self._data.after(cursor)

    def _find_min(self):
        """查找并回傳優先級佇列中鍵最小的記錄,并回傳其在位置串列中的位置"""
        if self.is_empty():
            raise Empty('當前優先級佇列為空!')
        small = self._data.first()
        walk = self._data.after(small)
        while walk is not None:
            if walk.element() < small.element():
                small = walk
            walk = self._data.after(walk)
        return small

    def __len__(self):
        """支持優先級佇列實體物件使用len(obj)語法回傳obj長度的方法"""
        return len(self._data)

    def add(self, key, value):
        """將鍵值對key-value封裝為一條記錄插入位置串列最后位置"""
        self._data.add_last(self._Item(key, value))

    def min(self):
        """回傳(但不洗掉)優先級佇列中鍵最小的記錄"""
        p = self._find_min()
        item = p.element()
        return item.key, item.value

    def remove_min(self):
        """回傳并洗掉優先級佇列中鍵最小的記錄"""
        p = self._find_min()
        item = self._data.delete(p)
        return item.key, item.value


class SortedPriorityQueue(PriorityQueueBase):
    """記錄按照鍵的大小排序的優先級佇列具體實作類"""

    def __init__(self):
        """創建一個空的優先級佇列,其所有記錄在底層由位置串列保存"""
        self._data = PositionalList()

    def __iter__(self):
        """生成優先級佇列中所有記錄的一個迭代"""
        cursor = self._data.first()
        while cursor is not None:
            item = cursor.element()
            yield item.key, item.value
            cursor = self._data.after(cursor)

    def __len__(self):
        """支持優先級佇列實體物件使用len(obj)語法回傳obj長度的方法"""
        return len(self._data)

    def add(self, key, value):
        """將鍵值對key-value封裝為一條記錄插入位置串列,保證該記錄插入后佇列中記錄按鍵的大小升序排列"""
        item = self._Item(key, value)  # 根據鍵值對key-value創建一條記錄
        walk = self._data.last()  # 將輔助指標初始化為參考當前佇列最后一條記錄
        while walk is not None and item < walk.element():  # 遍歷佇列,保證該記錄插入后佇列中記錄按鍵的大小升序排列
            walk = self._data.before(walk)
        if walk is None:  # 如果新記錄的鍵小于當前佇列所有鍵,則在佇列頭部插入記錄
            self._data.add_first(item)
        else:  # 否則在輔助指標參考的記錄后插入記錄
            self._data.add_after(walk, item)

    def min(self):
        """回傳(但不洗掉)優先級佇列中鍵最小的記錄"""
        if self.is_empty():
            raise Empty('當前優先級佇列為空!')
        p = self._data.first()
        item = p.element()
        return item.key, item.value

    def remove_min(self):
        """回傳并洗掉優先級佇列中鍵最小的記錄"""
        if self.is_empty():
            raise Empty('當前優先級佇列為空!')
        item = self._data.delete(self._data.first())
        return item.key, item.value


if __name__ == '__main__':

    # 測驗UnsortedPriorityQueue
    u_q = UnsortedPriorityQueue()
    u_q.add(5, 'A')
    print(u_q)  # [(5, 'A')]

    u_q.add(9, 'C')
    print(u_q)  # [(5, 'A'), (9, 'C')]

    u_q.add(3, 'B')
    print(u_q)  # [(5, 'A'), (9, 'C'), (3, 'B')]

    u_q.add(7, 'D')
    print(u_q)  # [(5, 'A'), (9, 'C'), (3, 'B'), (7, 'D')]

    print(u_q.min())  # (3, 'B')
    print(u_q.remove_min())  # (3, 'B')
    print(u_q)  # [(5, 'A'), (9, 'C'), (7, 'D')]
    print(len(u_q))  # 3
    print(u_q.is_empty())  # False

    # 測驗SortedPriorityQueue
    s_q = SortedPriorityQueue()
    s_q.add(5, 'A')
    print(s_q)  # [(5, 'A')]

    s_q.add(9, 'C')
    print(s_q)  # [(5, 'A'), (9, 'C')]

    s_q.add(3, 'B')
    print(s_q)  # [(3, 'B'), (5, 'A'), (9, 'C')]

    s_q.add(7, 'D')
    print(s_q)  # [(3, 'B'), (5, 'A'), (7, 'D'), (9, 'C')]

    print(s_q.min())  # (3, 'B')
    print(s_q.remove_min())  # (3, 'B')
    print(s_q)  # [(5, 'A'), (7, 'D'), (9, 'C')]
    print(len(s_q))  # 3
    print(s_q.is_empty())  # False

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/142220.html

標籤:區塊鏈

上一篇:商業資料分析從入門到入職(8)Python模塊、檔案IO和面向物件

下一篇:Python背景關系管理器

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more