• MerkleTree(HashLinkedList<T> hashlist) → $\Theta(n+n-1)=\Theta(2n)=\Theta(n)$ $(n)$ per la creazione dei nodi foglia, $(n-1)$ per la creazione dei nodi intermedi e il root

  • getHeight() → $\Theta(1)$

  • getIndexOfData(MerkleNode branch, T data) → $O(2^{h+1}-1)$ $h:$ altezza del sotto albero

  • getIndexOfData(T data) → $O(2^{h+1}-1)$ $h:$ altezza albero

  • validateData(T data) → $O(n)$ $n:$ dimensione lista nodi foglia

  • validateBranch(MerkleNode branch) → $O(2^{h+1}-1)$ $h:$ altezza dell’albero

  • validateTree(MerkleTree<T> otherTree) → $\Theta(1)$

  • findInvalidDataIndices(MerkleTree<T> otherTree) → $O(2^{h+1}-1)$ $h:$ altezza albero

  • getMerkleProof(T data) → $O(2^{h+1}-1+h+n)$ $h:$ altezza albero

  • getMerkleProof(MerkleNode branch) → $O(2^{h+2}-2+h)$ $h:$ altezza albero


  • getIndex(MerkleNode node, String dataHash, int nodesOnLeft) → $O(2^{h+1}-1)$ $h:$ altezza del sottoalbero con radice node

  • findInvalidDataIndicesRecursive(MerkleNode node, MerkleNode otherNode, int nodesOnLeft, Set<Integer> invalidIndices) → $O(2^{h+1}-1)$ $h:$ altezza albero

  • getPathToRoot(MerkleNode currentNode, String dataHash, List<MerkleNode> path) → $\Theta(2^{h+1}-1)$ $h:$ altezza albero