couresra课程 data structure 第二周 第三周笔记(含课程内容代码实现和排序算法比较)

这篇博客详述了数据结构中的动态数组、优先队列(堆)以及时间复杂度大于等于O(Nlog(n))的排序算法。动态数组讨论了扩容机制和时间复杂度分析;优先队列介绍了堆的性质、操作以及在排序和查找中的应用;排序算法比较了冒泡、选择、归并、堆排序和快速排序的时间和空间复杂度;最后探讨了不交集(Disjoint Set)的基本操作及其在集合问题中的应用。
摘要由CSDN通过智能技术生成

1.动态数组

概念:可以动态扩容 在数组的长度满了之后可扩容至两倍大小
时间复杂度: O(N)

三种分析方法:

aggregate method
amortized method
physicist method

2.优先队列(堆的应用)

  • 堆的性质: 父节点总比子节点的值要大
    可以按照一定的顺序取出数字

  • 有两种基本操作 这两种基本操作可体现出二叉堆的优势
    extractmax(x)
    insert(x)

  • 数的高度定义有两种:

edge 和 节点高度

  • 完整二叉树(二叉堆)的定义

最后一个等级(level)从左到右不能缺失

二叉完整树的最大高度,等比数列,总和等
最大高度: O ( l o g ( N ) ) O(log(N)) O(log(N))
假设root节点为LeveL1 则 第l个level共有 2 l − 1 个 节 点 2^{l-1}个节点 2l1
节点数共有 2 l − 1 2^l-1 2l1

  • 应用
    找第K大元素、排序

基本操作 sift_down sift_Up等函数的Python代码实现

课程内容介绍了二叉堆的基本操作(insert,extrcatmax,siftup,siftdown,remove,buildheap)等
所有操作的时间复杂度都为 O ( N l o g ( N ) ) O(Nlog(N)) O(Nlog(N))

##二元堆的基本操作
class binary_heap():
    def __init__(self,array):
        self.array = array
        self.size = len(array)
    def siftup(self,i):
        #偽代碼
        # while i > 1 and H[Parent(i )] < H[i ]:
        # swap H[Parent(i )] and H[i ]
        # i ← Parent(i )
        while (i > 0) and self.array[self.parent(i)] < self.array[i]:
            self.array[self.parent(i)],self.array[i] = self.array[i],self.array[self.parent(i)]
            i = self.parent(i)
    def siftdown (self,i):
        #偽代碼
        #         maxIndex ← i
        # ℓ ← LeftChild(i )
        # if ℓ ≤ size and H[ℓ] > H[maxIndex]:
        # maxIndex ← ℓ
        # r ← RightChild(i )
        # if r ≤ size and H[r ] > H[maxIndex]:
        
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值