Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9f0e76f

Browse files
author
ssjssh
committed
斐波那契树完成删除和change_key
1 parenta5f8fe0 commit9f0e76f

File tree

1 file changed

+107
-33
lines changed

1 file changed

+107
-33
lines changed

‎src/ssj/heap/fibonacci_heap.py

Lines changed: 107 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,26 @@ def __init__(self, *argv):
3030

3131
definsert(self,key):
3232
self.__size+=1
33-
ifself.__rootisNone:
34-
self.__root=self.Node(key)
33+
returnself.__insert_root(self.Node(key))
34+
35+
def__insert_root(self,node,change_root=True):
36+
node.parent=None
37+
ifnotself.__root:
38+
self.__root=node
39+
self.__root.left=node
40+
self.__root.right=node
3541
else:
36-
new_node=self.Node(key,left=self.__root.left,right=self.__root)
37-
self.__root.left.right=new_node
38-
self.__root.left=new_node
39-
ifnew_node.key<self.__root.key:
40-
self.__root=new_node
42+
node.left=self.__root.left
43+
node.right=self.__root
44+
self.__root.left.right=node
45+
self.__root.left=node
46+
47+
ifself.__root.key>node.keyandchange_root:
48+
self.__root=node
49+
returnnode
4150

4251
defextract_min(self):
43-
ifself.__rootisNone:
52+
ifnotself.__root:
4453
returnNone
4554

4655
result=self.__root
@@ -50,24 +59,28 @@ def extract_min(self):
5059
child=self.__root.child
5160
foriinxrange(0,self.__root.degree):
5261
next_node=child.right
53-
self.__root.left.right=child
54-
child.left=self.__root.left
55-
self.__root.left=child
56-
child.right=self.__root
57-
child.parent=None
62+
self.__remove_self(child)
63+
self.__insert_root(child)
5864
child=next_node
5965

6066
# 移除根节点
61-
self.__root.left.right=self.__root.right
62-
self.__root.right.left=self.__root.left
67+
self.__remove_self(self.__root)
6368
ifself.__root.rightisself.__root:
6469
self.__root=None
6570
else:
6671
self.__root=self.__root.right
6772
self.__extract_consolidating()
6873

74+
result.left=result
75+
result.right=result
76+
result.parent=None
6977
returnresult.key
7078

79+
@classmethod
80+
def__remove_self(cls,node):
81+
node.left.right=node.right
82+
node.right.left=node.left
83+
7184
def__extract_consolidating(self):
7285
# 合并根链表
7386
node_degrees= {}
@@ -100,19 +113,7 @@ def __extract_consolidating(self):
100113
self.__root=None
101114

102115
ford,nodeinnode_degrees.iteritems():
103-
node.parent=None
104-
ifself.__rootisNone:
105-
self.__root=node
106-
self.__root.left=node
107-
self.__root.right=node
108-
else:
109-
node.left=self.__root.left
110-
node.right=self.__root
111-
self.__root.left.right=node
112-
self.__root.left=node
113-
114-
ifself.__root.key>node.key:
115-
self.__root=node
116+
self.__insert_root(node)
116117

117118
@staticmethod
118119
def__link_to(src,dest):
@@ -127,7 +128,7 @@ def __link_to(src, dest):
127128

128129
dest_child=dest.child
129130
src.parent=dest
130-
ifdest_childisNone:
131+
ifnotdest_child:
131132
dest.child=src
132133
src.left=src
133134
src.right=src
@@ -139,13 +140,39 @@ def __link_to(src, dest):
139140
dest.degree+=1
140141

141142
defunion(self,other):
142-
pass
143+
ifnotself.__root:
144+
self.__root=other.__root
145+
else:
146+
self_left=self.__root.left
147+
other_right=other.__root.right
148+
self.__root.left=other.__root
149+
other.__root.right=self.__root
150+
self_left.right=other_right
151+
other_right.left=self_left
152+
self.__root=self.__rootifself.__root.key<other.__root.keyelseother.__root
153+
self.__size+=other.__size
154+
155+
returnself
143156

144157
defmin(self):
145-
returnNoneifself.__rootisNoneelseself.__root.key
158+
returnNoneifself.__rootelseself.__root.key
146159

147160
defchange_key(self,node,new_key):
148-
pass
161+
"""
162+
给node设置一个比其key小的值
163+
:param node:
164+
:param new_key:
165+
:return:
166+
"""
167+
ifnode.key<new_key:
168+
return
169+
node.key=new_key
170+
parent=node.parent
171+
ifparentandparent.key>node.key:
172+
self.__cut(node)
173+
self.__cascade_cut(parent)
174+
ifself.__root.key>node.key:
175+
self.__root=node
149176

150177
def__len__(self):
151178
returnself.__size
@@ -154,15 +181,62 @@ def delete(self, node):
154181
self.change_key(node,float('-Inf'))
155182
self.extract_min()
156183

184+
def__cut(self,node):
185+
parent=node.parent
186+
ifnotparent:
187+
returnnode
188+
189+
# 处理parent的child指针
190+
ifnode.rightisnode:
191+
parent.child=None
192+
else:
193+
parent.child=node.right
194+
self.__remove_self(node)
195+
parent.degree-=1
196+
self.__insert_root(node)
197+
node.mark=False
198+
returnnode
199+
200+
def__cascade_cut(self,node):
201+
parent=node.parent
202+
# 如果parent为None,说明这个节点在根链表上,因此不需要继续处理
203+
ifparent:
204+
ifnotnode.mark:
205+
node.mark=True
206+
else:
207+
# 如果已经丢失了两个节点,那么要把本节点移到根链表上
208+
self.__cut(node)
209+
self.__cascade_cut(parent)
210+
157211

158212
defmain():
213+
importrandom
159214
test= ['O','J','S','Y','C','M','B','R','N','F','L','Z','U','Q','A','G','V','E','D','W','I',
160215
'H','T','K','X','P']
161-
216+
random.shuffle(test)
217+
rele='Z'
218+
test.remove(rele)
162219
heap=FibonacciHeap(*test)
220+
rnode=heap.insert(rele)
221+
222+
foriinxrange(0,random.randint(1,len(heap))):
223+
print(heap.extract_min())
224+
225+
print("change a node key")
226+
heap.change_key(rnode,0)
227+
163228
foriinxrange(0,len(heap)):
164229
print(heap.extract_min())
165230

231+
print("test union")
232+
one= [10,20,0]
233+
other= [15,5,30]
234+
one_heap=FibonacciHeap(*one)
235+
other_heap=FibonacciHeap(*other)
236+
one_heap.union(other_heap)
237+
foriinxrange(0,len(one_heap)):
238+
print(one_heap.extract_min())
239+
166240

167241
if__name__=="__main__":
168242
main()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp