逻辑结构:

                  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. 前端学习 之 CSS(三)

    九:浮动 浮动是css里面布局最多的一个属性,也是很重要的一个属性. float:表示浮动的意思. 属性值: none: 表示不浮动,默认 left: 表示左浮动 right:表示右浮动 例: htm ...

  2. 3.ORM框架一对多的关系及使用

    一对多就是主键与外键的关系,通过一个用户表,角色表进行举例子 角色表role:有外键,对应的是user表的主键 用户表users: from flask import Flask, render_te ...

  3. [转]JSP自定义标签

    原文链接 当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 自定义标签 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写 ...

  4. 【剑指Offer面试编程题】题目1360:乐透之猜数游戏--九度OJ

    题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备了一些不同类型的骰子,打算以掷骰子猜数字的方式发放奖品.例如,有的骰子有6个点数(点数 ...

  5. 基本使用-ElasticSearch

    基本使用-ElasticSearch 说明:本篇文章主要是通过springboot整合es的基本使用基础,详细了解的可以看我上一篇文章:全文搜索-ElasticSearch 有朋友私信我上一篇没有环境 ...

  6. CentOS7中Tomcat的安装和配置

    Tomcat运行需要设置JRE目录,全局变量配置,请参见: Linux下JDK的安装和配置   当然也可以直接修改Tomcat的配置文件,请自行度娘   1.下载并解压 请先去官网找到需要下载的tom ...

  7. html常用整理

    视频链接:https://www.bilibili.com/video/av5862916?from=search&seid=12139895566389560177 我的第一个html &l ...

  8. Flask - 请求扩展,钩子函数(Django的中间件) --> 请求前,中,后,

    例子1. 处理请求之前 @app.before_request 在请求之前,这个被装饰的函数会被执行 用户登录验证代码可以在这里写 @app.before_request def process_re ...

  9. JAVA关于回文判断的实现

    (一). 设计思想: 首先输入字符串,然后判断长度若长度为0或1则输出TRUE若长度大于一则进行判断, 若符合条件则输出TRUE反之输出FALSE. (二)程序源代码 import java.util ...

  10. nginx反向代理(2)

    目录 nginx缓存 基本概念 常用模块 proxy_cache 超时相关 常见架构 ========================================================= ...