考慮一種佇列:每次取出的資料是佇列中最小的元素。這種佇列可用於程式排程,作業分配等領域,這種佇列被稱為優先佇列,核心的方法有:
優先佇列可以使用堆這一資料結構實現
二叉堆是除了底層外被完全填滿的二叉樹,最底層的資料也是從左到右填入(完全二叉樹)。因為其填滿的特性,可以直接使用陣列實現該樹型結構:乙個位於陣列i位置的節點的子節點分別是2*i和2*i+1
當乙個二叉堆實現優先佇列時,除了要滿足堆的基本特性,還要滿足乙個特性:對任意乙個節點,其值小於其所有的子節點(若有子節點)。則遞迴的來看,位於根(陣列位置0)的節點即為最小的資料。
對於堆,每次插入的位置是固定的,若直接將插入元素插入該位置,則優先佇列的特性被破壞,因此,需要找到合適的插入位置。操作方法為遞迴的比較插入位置和插入位置父節點的大小,若滿足特性則插入,不滿足則交換待插入位置和父節點的資料(將父節點資料寫入待插入位置,待插入位置為新的父節點)
刪除方法有兩個功能,第乙個功能是將最小的資料彈出,這可以直接返回根節點的值實現;第二個功能是更新新的元素,由於堆少了乙個節點,而該節點的位置必須是底層最右側的節點。因此將該節點資料取出,並插入到跟節點的位置,這樣堆的特性被破壞。於是取跟節點為待插入位置,遞迴的比較待插入節點和子節點的最小節點,獲得插入該元素的位置。
這段**寫的時候狀態比較差,僅供參考
type nodedata struct
type heap2d struct
func newheap2d() *heap2d
newheap.size = 15
newheap.lenght = 1
for i := 0; i < newheap.size; i++
}return newheap
}
func (h *heap2d) insert(din nodedata) error
i := 0
for i = h.lenght; h.heap[i/2].num >= din.num && i != 0; i = i / 2
h.heap[i] = din //插入
h.lenght++
return nil
}
func (h *heap2d) deletemin() (nodedata, error) , errors.new("heap empty")
}dout := h.heap[1] //取出根節點資料,該資料為優先順序最高的節點
err := h.downflow(1, h.heap[h.lenght-1]) //呼叫下移方法將堆中的最後乙個節點從根節點插入
h.lenght--
return dout, err
}
func (h *heap2d) downflow(nodenum int, insert nodedata) error else if 2*nodenum >= h.lenght else if insert.num < h.heap[h.findminson(nodenum)].num
// 兩個子節點的最小標號小於帶插入資料標號,遞迴該過程
next := h.findminson(nodenum)
h.heap[nodenum] = h.heap[next]
return h.downflow(next, insert)
}// 該方法用於計算出最小子節點標號
func (h *heap2d) findminson(nodenum int) int
if h.heap[2*nodenum].num > h.heap[2*nodenum+1].num
return 2 * nodenum
}
js 繪製2D機櫃(一)2D機櫃的基本繪製
今天被領導要求用js繪製2d機櫃用於向客戶展示客戶資產以及管理裝置,雖然我是後端,既然被分配到這個任務那就得做好。繪製的第一步當然是繪製機櫃框框,這個很簡單,寫個div然後將邊框設定下就好了 parentblock 這裡將背景設定成灰色顯得真實些 為了辨別機櫃,這裡在機櫃上面再加乙個機櫃title ...
transform基本轉換應用2D
最近在折騰transform,其實不想寫啥的,但看在忙活的一天多的份上就簡單寫一下額。ps 只作為記錄,語言表達能力有限 transform常用的幾個值 translate 偏移 scale 縮放 skew 拉伸 傾斜 rotate 旋轉 ps 這幾個值都比較好理解,只要記得用到的座標軸y軸是向下的...
2D遊戲開發(2)
每次給遊戲新增新功能時,通常也會引入一些新設定。為了讓所有的設定進行統一管理,我們可以配置乙個名為 setting的模組,這個模組中包含乙個setting的類,用來儲存所有的設定。usr bin env python3.5 filename setting 儲存所有的設定 class setting...