zoukankan      html  css  js  c++  java
  • 堆 [用来维护集合最值的高效数据结构]
    定义:
    堆是一种特殊的完全二叉树,它可以分为两类,分别是大顶堆和小顶堆。
    在小顶堆中,每个父节点的值都要小于其两个子节点的值,大顶堆则相反。

    堆实际的存储结构和结构操作。之前我们说过,它其实就是一个数组,
    在插入元素时,从数组的末尾放入元素,而删除元素时,是从数组的头部移出元素。

    如果我们把堆的存储结构看成是一个队列的话,那堆就是一种可以灵活控制元素出队优先级的数据结构,
    我们管这种结构就叫做优先队列。堆只是实现优先队列的其中一种方式,当然也是最普遍的方式。

    堆有两种基本的结构操作,插入操作和删除最值操作。在插入操作中,我们是将新元素放到整个堆结构的末尾,
    然后对新插入的元素执行向上调整的操作,一直调整到满足堆的结构性质为止。
    而在删除操作中,我们是将堆顶元素弹出以后,再将堆的尾部元素移动到堆顶,对其执行向下调整的操作,
    一直调整到满足堆的结构性质为止。

    好了,那我们来总结一下堆排序的流程:在原数组上建立堆结构将堆顶元素与堆末元素进行调换,
    再对堆顶元素进行向下调整经过 n 轮操作以后,数组中的元素就有序了


    假设,我们想在大量的数据,如 100 亿个整型数据中,找到值最大的 K 个元素,K 小于 10000。你会怎么做呢?
    1. 归并排序
    2. K 轮查找

    数据结构个人理解:
    在解决实际问题时,我们一定是通过某些性质来反推我们需要的数据结构。因此准确理解各种数据结构的性质,才是将理论应用到实践的要点。

    因此,只有从问题性质出发选择合适的算法数据结构,才能彻底增强你解决实际问题的能力。届时,你所思考的将不再是使用某一个数据结构解决问题,
    而是真正学会使用某一类数据结构解决问题。好了,今天就到这里了,道阻且长,行则将至,我是胡光,我们下期见。


    纸上学来终觉浅,觉知此事需躬行
  • 相关阅读:
    WinForm简单进度条
    金庸群侠传 3小时爆机
    One Day
    css组件化
    PHP判断端口是否打开的代码
    PHP下像JQUery下查找修改HYML元素的类PHP Simple HTML DOM Parser
    兼容IE和FF的添加收藏和设为主页代码
    注册成功啦,终于在博客园注册成功了,以后要更加努力的学习技术啊!
    ppz css栅格框架
    使用live writer 发布一下日志
  • 原文地址:https://www.cnblogs.com/dreamHighMjc/p/15074367.html
Copyright © 2011-2022 走看看