数据结构学习day3:队列与堆排序

1  队列与堆排序知识

1)队列

队列是一种“先进先出”的数据结构or线性表,允许插入的一端称为队尾,允许删除的一段称为队头。

队列通常分为两种类型:顺序队列(采用顺序存储,当长度固定时使用)和链式队列(采用链式存储,长度不确定时使用)

队列两个基本操作:出队和入队。(参考博客及详细见:链接1)

简言之,队列是从队尾进入,队头出(有点像管道,一端入另一端出),因此容易实现“先进先出”。(若理解有误,望指出)

2)栈

栈是一种“先进后出(后进先出)”的数据结构or线性表,仅有一端进行插入和删除。

3)堆排序

堆是用数组实现的二叉树,根据“堆属性”来排序,因此“堆属性”决定了树中结点的位置。堆与普通二叉树又有所区别,具体见链接3

堆的两种形式(参考博客:链接2):

      a)最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其他孩子的值大;

      b)最小堆:根结点的键值是所有堆结点键值中的最小者,且每个结点的值都比其他孩子的值小。

堆排序思想:a)根据初始数组构造初始堆(构建一个完全二叉树,保证所有的父节点都比它的孩子结点数值大);

b)每次交换第一个和最后一个元素,输出最后一个元素(最大值),然后将剩下元素重新调整为大根堆。

其中b):第一次交换R[0]和R[n],输出R[n],然后重新调整堆为最大堆,继续交换R[0]和R[n-1],输出R[n-1],以此反复直至交换了R[0]和R[1],输出R[1],最后输出R[0]。由此实现从大到小的排序。

例子:a)步骤:(图片及上述内容均来自链接2

b)步骤:

 

2  hash table 和单链表回顾

hash table是根据关键码值(key value)而直接进行访问的数据结构;单链表是由一系列不连续的结点构成的链式存储结构,结点由存储数据元素的数据域和存放结点位置的指针域两部分构成。

3 leetcode # 239 Sliding Window Maximum

问题如图:

way 1 : solution demo

思路:1) 首先判断传入list是否为空,若为空直接返回list;若不为空转到2);

           2) 判断滑窗大小k是否不大于list的长度,若否直接返回list最大值;若是转到3);

           3) 设计循环,每一次循环内计算滑窗内最大值保存在k_max中,最后返回k_max;

实际上,此问题的测试中不会出现滑窗大小k大于list的情况,因此省略2)的判断。

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        if nums:
            return [max(nums[i:i+k]) for i in range(len(nums)-k+1)]
        else:
            return nums

result:

(想不到怎么用队列的思想了~~~)

参考:

链接1:https://www.cnblogs.com/linuxAndMcu/p/7735444.html

链接2:https://www.cnblogs.com/jingmoxukong/p/4303826.html

链接3:https://www.jianshu.com/p/6b526aa481b1

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值