SICP_Python版第二章:集合的表示

构造最简单也最低效的集合表示法

def first(x):return x[0]
def rest(x):return x[1:]
def element_of(x,s):
    if len(s)==0:return False
    elif x==first(s):return True
    return element_of(x,rest(s))
def adjoinset(x,s):
    if element_of(x,s):return s
    return (x,)+s
def intersection(s1,s2):
    if len(s1)+len(s2)==0:return ()
    if element_of(first(s1),s2):
        return (first(s1),)+intersection(rest(s1),s2)
    else:return intersection(rest(s1),s2)
def union_set(s1,s2):
    if len(s1)==0:return s2
    if len(s2)==0: return s1
    if not element_of(first(s1),s2):
        return (first(s1),)+union_set(rest(s1),s2)
    return union_set(rest(s1),s2)
def make_set(s):
    final_set = ()
    for each in s:
        final_set=adjoinset(each,final_set)
    return final_set

2.612.62 构造集合是升序排列的,这样可以对元素各个集合操作进行加速。合并和交集改进为O(n)

def rest(x):return x[1:]
def element_of(x,s):
    if len(s)==0:return False
    elif x==first(s):return True
    elif x < first(s):return False
    return element_of(x,rest(s))
def adjoinset(x,s):
    if len(s)==0:return (x,)
    if x==first(s):return s
    elif x>first(s):return (first(s),)+adjoinset(x,rest(s))
    else:return (x,)+s
def intersection(s1,s2):
    if len(s1)==0 or len(s2)==0:return ()
    if first(s1)==first(s2):
        return (first(s1),)+intersection(rest(s1),rest(s2))
    elif first(s1)<first(s2):
        return intersection(rest(s1),s2)
    return intersection(s1,rest(s2))
def union_set(s1,s2):
    if len(s1)==0:return s2
    if len(s2)==0: return s1
    if first(s1)==first(s2):
        return (first(s1),)+union_set(rest(s1),rest(s2))
    elif first(s1)<first(s2):
        return (first(s1),)+union_set(rest(s1),s2)
    return union_set(s1,rest(s2))
def make_set(s):
    final_set = ()
    for each in s:
        final_set=adjoinset(each,final_set)
    return final_set

ef entry(tree):return tree[0]
def left_tree(tree):return tree[1]
def right_tree(tree):return tree[2]
def make_tree(data,left=None,right=None):return [data,left,right]
def element_of(x,s):
    if s==None:return False
    if x==entry(s):return True
    elif x<entry(s):return element_of(x,left_tree(s))
    else:return element_of(x,right_tree(s))
def add_node(x,t):
    if t==None: t = make_tree(x)
    elif x<entry(t):t[1] = add_node(x,left_tree(t))
    else:t[2] = add_node(x,right_tree(t))
    return t
2.63(a) 都是中序遍历的结果。
(b) :复杂度是不一样的,前者是O(nlogn)的复杂度,后者是O(N).

T(N)=2T(N/2)+O(N)

T(N)=2T(N/2)+O(1)

2.64

T(N)=O(N)

def list_to_tree(sets):
    def sub(x):
        if x<0:return ()
        return sets[0:x]
    n = len(sets)
    leftsize = (n-1)>>1
    if n == 0:return None
    first = sets[leftsize]
    left_tree = list_to_tree(sub(leftsize))
    right_tree = list_to_tree(sets[leftsize+1:])
    return make_tree(first,left_tree,right_tree)
print(list_to_tree((1,2,3,4,5,6,7)))

2.65 只是示范一下Union_set。

注意,已开始我尝试直接递归求解,但是虽然求出来了,但不是O(N)的复杂度,这里也给出一个提示:

def tree_union_set(s1,s2):
    x,y = tree_to_list(s1),tree_to_list(s2)
    u = union_set(tuple(x),tuple(y))
    return list_to_tree(u)
def tree_to_list(s):
    ans = []
    def add(x):
        if x==None:return
        add(left_tree(x));ans.append(entry(x));add(right_tree(x))
    add(s)
    return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值