'Java和Python上的算法速度排名为什么不同?'

2024-05-13 22:55:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个Leetcode问题subtree-of-another-tree。总结了2种不同类型的算法here。你知道吗

“naiveapproach”的运行时间在Python中约为250ms,在Java中为0~5ms。然而,在Python中,据说更有效的“高级方法”的运行时间约为88ms,在Java中为10ms。你知道吗

为什么高级方法在Java中运行较慢?你知道吗

以下是我用来测试的代码:

天真的方法:

Python:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
        if s is None and t is None:
            return True
        elif s is None or t is None:
            return False
        else:
            if s.val == t.val:
                left = self.isSame(s.left, t.left)
                right = self.isSame(s.right, t.right)
                if left and right:
                    return True
                else:

                    left = self.isSubtree(s.left, t)
                    right = self.isSubtree(s.right, t)
                    return left or right
            else:
                left = self.isSubtree(s.left, t)
                right = self.isSubtree(s.right, t)
                return left or right
    def isSame(self, s, t):
        if s is None and t is None:
            return True
        elif s is not None and t is not None:
            if s.val == t.val:
                left = self.isSame(s.left, t.left)
                right = self.isSame(s.right, t.right)
                return left and right
            else:
                return False
        else:
            return False

爪哇语:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    TreeNode headT;
    public boolean isSubtree(TreeNode s, TreeNode t) {
        headT = t;
        return isSame(s, headT);
    }

    public boolean isSame(TreeNode s, TreeNode t) {
        if (s == null && t == null) {
            return true;
        }
        if (s == null || t == null) {
            return false;
        }
        if (s.val == t.val) {
            return (isSame(s.left, t.left) && isSame(s.right, t.right)) || isSame(s.left, t) || isSame(s.right, t);
        }
        return isSame(s.left, headT) || isSame(s.right, headT);
    }
}

高级方法:

Python:

class Solution(object):
    def isSubtree(self, s, t):
        """
        :type s: TreeNode
        :type t: TreeNode
        :rtype: bool
        """
        def convert(p):
            return "^" + str(p.val) + "#" + convert(p.left) + convert(p.right) if p else "$"

        return convert(t) in convert(s)

爪哇

class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        String  ss = convert(s);
        String  tt = convert(t);
        return ss.contains(tt);
    }
    public String  convert(TreeNode s){
        if (s==null){
            return "#";
        }else{
            return "^" + Integer.toString(s.val) + convert(s.left) + convert(s.right);
        }
    }
}

Tags: selfrightnoneconvertreturnifisdef