Untitled
unknown
python
2 years ago
4.3 kB
5
Indexable
from random import randint from statistics import mean, stdev def print2(text): if False: print(text) class Node: def __init__(self, nbr, parent): self.parent = parent self.left = None self.right = None self.marked = False self.nbr = nbr def testRules(self): if not self.marked: if self.left and self.left.marked and self.right.marked: print2("Marking from rule node " + str(self.nbr)) self.marked = True return True if self.parent and self.parent.marked and (self.parent.left.marked or self.parent.right.marked): print2("Marking from rule node " + str(self.nbr)) self.marked = True return True else: return False class Tree: def __init__(self, n): self.n = n nodeList = [] self.root = Node(1, None) nodeList.append(self.root) for i in range(2,n+1,2): left = Node(i, nodeList[i//2-1]) right = Node(i+1, nodeList[i//2-1]) nodeList.append(left) nodeList[i//2-1].left = left nodeList.append(right) nodeList[i//2-1].right = right self.nodeList = nodeList def getRoot(self): return self.root def find(self, nbr): if self.root is not None: return self._find(nbr, self.root) else: return None def _find(self, nbr, node): if nbr == node.nbr: return node elif (nbr < node.nbr and node.left is not None): return self._find(nbr, node.left) elif (nbr > node.nbr and node.right is not None): return self._find(nbr, node.right) def printTree(self): if self.root is not None: self._printTree(self.root) def _printTree(self, node): if node is not None: self._printTree(node.left) print(str(node.nbr) + ' ') self._printTree(node.right) def mark(self, nbr): node = self.nodeList[nbr-1] node.marked = True print2("Marking node " + str(nbr)) self.evalGame(node.left) self.evalGame(node.right) self.evalGame(node.parent) if node.parent and node.parent.left is node: self.evalGame(node.parent.right) elif node.parent: self.evalGame(node.parent.left) def evalGame(self, node): if node is None or node.marked: return elif node.testRules(): self.evalGame(node.left) self.evalGame(node.right) self.evalGame(node.parent) if node.parent and node.parent.left is node: self.evalGame(node.parent.right) elif node.parent: self.evalGame(node.parent.left) def isDone(self): for node in self.nodeList: if not node.marked: return False return True def roundOne(tree): counter = 0 while not tree.isDone(): counter += 1 tree.mark(randint(1, tree.n)) return counter def roundTwo(tree): markOrder = [*range(1,tree.n+1)] for i in reversed(range(tree.n)): r = randint(0,i) markOrder[i], markOrder[r] = markOrder[r], markOrder[i] counter = 0 while not tree.isDone(): counter += 1 tree.mark(markOrder[counter]) return counter def roundThree(tree): counter = 0 while not tree.isDone(): nodeNbrs = [] for node in tree.nodeList: if not node.marked: nodeNbrs.append(node.nbr) r = randint(0,len(nodeNbrs)-1) counter += 1 tree.mark(nodeNbrs[r]) return counter def main(): data = {} for h in range(2,15): N = 2**h-1 serie = [] for i in range(3): tree = Tree(N) serie.append(roundThree(tree)) #print("N = " + str(N) + ", i = " + str(i)) data[N] = (mean(serie), stdev(serie)) print(data) if __name__ == "__main__": main()
Editor is loading...