由于数据结构和算法的一些特点,我们在编程时候经常需要除以2。比如计算一些有关二叉树或者二分查找的index的问题。众所周知,计算机计算除法是很没有效率的,这时候我们就可以用位运算来代替除法以提高效率。比如,leecode108 把有序数组转为二叉搜索树。官方答案 以及运行效率如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
def helper(left, right):
if left > right:
return None
# 总是选择中间位置左边的数字作为根节点
mid = (left + right) // 2
root = TreeNode(nums[mid])
root.left = helper(left, mid - 1)
root.right = helper(mid + 1, right)
return root
return helper(0, len(nums) - 1)
我们可以看到,官方答案是除法运算,然后,把除法替换成位运算如何呢?我们继续看一下。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
if len(nums)==0:return None
# [1,2,3,4,5,6,7,8,9]
def helper(left,right):
middle = (left+right)>>1
if left > right:
return None
root = TreeNode(nums[middle])
root.left = helper(left,middle-1)
root.right = helper(middle+1,right)
return root
return helper(0,len(nums)-1)
``
我们发现,运行效率大大提升了。
顺便说一句, 与 位运算and 1(确定奇偶性 合用 效果更佳)