堆

逻辑结构:

                  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. 【摘录自MDN】预定义函数

    JavaScript语言有好些个顶级的内建函数: eval() eval()方法会对一串字符串形式的JavaScript代码字符求值. uneval()  uneval()方法创建的一个Object的 ...

  2. MySQL报Too many connections

    错误信息 Exception in thread "main" java.sql.SQLNonTransientConnectionException: Data source r ...

  3. Chrome 打不开任意网页以及设置、扩展程序等页面解决方法

    解决办法:在快捷键加启动参数 -no-sandbox,如果可以启动,就说明是电脑上有某个软件与Chrome沙盒有冲突

  4. LockSupport源码分析

    LockSupport提供park()和unpark()方法实现线程阻塞和唤醒.底层实现是通过sun.misc.Unsafe的park和unpark. 关于sun.misc.Unsafe的说明请参见我 ...

  5. 2020新春公益赛 writeup

    简单的招聘系统 无需注册账号,admin'or 1#登陆,到blank page页面,在输入key处发现有注入点: /pages-blank.php?key=1%27+union+select+1%2 ...

  6. python中:from * import 与 import 详解

    在python 中导入模块是我们最常用的功能,基本每个.py 文件中都会有 import 或者是 from * import 语句,可是,这两种方法有什么不同,有该怎么用?今天就好好分析一下. 先上定 ...

  7. Java基础知识笔记第三章:运算符表达式语句

    算术运算符与表达式 操作符 描述 例子 + 加法 - 相加运算符两侧的值 A + B 等于 30 - 减法 - 左操作数减去右操作数 A – B 等于 -10 * 乘法 - 相乘操作符两侧的值 A * ...

  8. 夯实Java基础(二十)——JAVA正则表达式

    1.为什么要用正则表达式 首先我们先来做一道题目:判断一个字符串是否由数字组成.代码示例如下: public class Test { public static void main(String[] ...

  9. HDU 5587:Array

    Array  Accepts: 118  Submissions: 232  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 131072/ ...

  10. Git远程分支代码强制回退&Tag添加

    Git指令大全:https://www.alexkras.com/getting-started-with-git/ Git提交错了,还是Master分支,哎呦喂咋整?请见下文.   [场景描述] 项 ...