逻辑结构:

                  1

                  /        \

                1          3

               /     \     /    \

              4     5   6      null

物理结构;

1.首先堆是一个完全二叉查找书(Complete Binary Search Tree)树,观察一下堆的逻辑结构和物理结构,逻辑结构是一颗完全二叉查找树,物理结构是一个数组.

性质:堆的实现是通过构造二叉堆,这种数据结构具有一下几个性质:

1.任意节点小于它的所有后裔,最小元素在堆的根上(堆序性)。

2.堆总是一颗完全树。(Complete Tree)

3.将根节点的最大堆叫做Max Heap,最小堆叫做Min Heap。

4.左子节点=index of parent *2+1;

5.右子节点=index of parent*2+2;

支持的基本操作:

1.insert:向堆中插入一个新元素:Time Complete:O(log(n));

2.update:将新元素更新使其符合堆的性质:Time Complete:O(log(n));

3.get/top:获取当前堆顶元素的值:Time Complete:O(1);

4.pop:删除堆顶元素的值:Time Complete:O(log(n));

5.heapify:使得一个Unsorted array的元素变成一个堆:时间复杂度是O(c*n);

经典的算法题;

1.从没有排序的n个元素中发现最小的K个元素。

重点:面试问到这个问题,首先需要向面试官问清楚具体情况,k和n的大小关系。

Solution1:

使用快排排序这个元素,然后返回前K个元素。

Solution2:

Step1:首先建立一个最小堆  O(n);

Step2:弹出前K个最小的元素 O(klogn);

依据上面堆的基本操作得出:Total Time Complete:O(n+klog(n));

Solution3:

Step1:建立一个包含K个元素的最大堆。

Step2:循环迭代从第k+1个元素到第n个元素,然后对于当前的X;

case1:

if X<max-heap.top(),max-heap.pop(),and max-heap.insert(X);  --->log(k)

Case2:

else, do nothing;

依据上面的堆的基本操作得出: Total Time Complete:= O(K)+O((n-k)logk);

Case1: k <<< a      e.g. k=20  n=1 billion

  O(c * n)              O(n*(logk))

依赖于具体的情况。

Case2: k~n         e.g. k~0.5 billion    n=1 billion

   O(nlogn)             O(nlogn)

结论:解法2和解法3,我们很难去说哪一个更好(因为它依赖于具体的k和n的大小).

Sulution4:

quick sort partition.(分区快排,直接干掉一半不需要的)

    smaller          larger

xxxxxxxxxxxxxxxxxxx P1 xxxxxxxxxxxxxxxxxxxx          n = 10000, k=300;

           pviot

  smaller          larger

 xxxxx  P2  xxxxx                         n = 5000,k = 300;

     pivot

  smaller          larger

 xx p3 xxx                            n=2500 ,k=300

 pivot  

                           

  smaller           larger                  n = 2499 ,k = 299

x p4 xxxxx

Quick partiotion:

worst case:O(n*2)

Average case:O(n)            n+n/2+n/4+n/8;

  

Heap(堆)的基础知识入门的更多相关文章

  1. Linux基础知识入门

    [Linux基础]Linux基础知识入门及常见命令.   前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1: ...

  2. Hibernate入门1. Hibernate基础知识入门

    Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...

  3. Oracle 基础知识入门

    前记: 近来项目用到Oracle数据库,大学学了点,后面基本忘记得差不多了,虽然基本语法跟sql 差不多,但是oracle知识是非常多的. 这里简单说点基础知识,希望后面补上更多的关于ORacle知识 ...

  4. SpringMVC(一) 基础知识+入门案例

    SpringMVC基础知识 1.什么是Springmvc 2.springmvc 框架的原理(必须掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 3.SpringMVC 入门程序 目的:对 ...

  5. 虚拟机堆(Heap)的基础知识

    概述 一个进程对应一个JVM实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核 ...

  6. java学习基础知识入门

    基础入门知识(一) 一.java技术的分类 java按照技术标准和应用场景的不同分为三类,分别是JAVASE.JAVAEE.JAVAME JAVASE : 平台标准版,用于开发部署桌面,服务器以及嵌入 ...

  7. DOM0,DOM2,DOM3事件,事件基础知识入门

    事件是javascript和HTML交互基础, 任何文档或者浏览器窗口发生的交互, 都要通过绑定事件进行交互; 事件有DOM0, DOM2和DOM3的区分(别问我怎么少了一个DOM1, 也没找到DOM ...

  8. java基础知识入门

    一.java简介及原理图 Java的前世今生 Java之父詹姆斯·高斯林: 1967年, 12岁用报废的电话机和电视做了一台电子游戏机; 1983年, 获得卡内基梅隆大学计算机科学博士学位; 1983 ...

  9. 1 python大数据挖掘系列之基础知识入门

    preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...

随机推荐

  1. idea选择主题

    主题下载地址1:http://color-themes.com/?view=index 主题下载地址2:http://www.themesmap.com/ 主题下载地址3:http://www.ria ...

  2. jquery-ajax的用法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Python 爬取 热词并进行分类数据分析-[数据修复]

    日期:2020.02.01 博客期:140 星期六 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...

  4. 最权威的json自定义格式

    1.封装result,作为返回的对象 public class Result<T> {        private int code;    private String msg;    ...

  5. luogu P1044 火车进出栈问题(Catalan数)

    Catalan数就是魔法 火车进出栈问题即: 一个栈(无穷大)的进栈序列为 1,2,3,4,...,n 求有多少个不同的出栈序列? 将问题进行抽象, 假设'+'代表进栈, 则有'-'代表出栈 那么如果 ...

  6. 让eclipse恢复默认布局

    参考:https://blog.csdn.net/howlaa/article/details/39178359 Window -> Perspective -> Reset Perspe ...

  7. 【原】简单shell练习(四)

    1.查看已开启端口信息 #ss -ln 2.列出谁在使用某个端口(如:80) #lsof -i:80 3.显示文件夹下文件信息 #find /home/root -type f#find -type ...

  8. 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数

    Scala高级特性 1.    课程目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  9. webservice之实现天气预报

    前通过传智的视频自学了webservice的基本使用,也了解到webservice就是一种跨编程语言和跨操作系统平台的远程调用技术. 对于这些理论知识在这里也不再做过多的解释,本次主要就是记录与分享使 ...

  10. 「Luogu P2468 [SDOI2010]粟粟的书架」

    这道题分为两个部分 Part1 前置芝士 前缀和(后缀和,二维前缀和):可以预处理一下数据. 二分查找:可以在较短的时间内找出答案. 具体做法 可以发现\(R,C\)不大,只有\(200\),于是可以 ...