Heap(堆)的基础知识入门
堆
逻辑结构:
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(堆)的基础知识入门的更多相关文章
- Linux基础知识入门
[Linux基础]Linux基础知识入门及常见命令. 前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1: ...
- Hibernate入门1. Hibernate基础知识入门
Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...
- Oracle 基础知识入门
前记: 近来项目用到Oracle数据库,大学学了点,后面基本忘记得差不多了,虽然基本语法跟sql 差不多,但是oracle知识是非常多的. 这里简单说点基础知识,希望后面补上更多的关于ORacle知识 ...
- SpringMVC(一) 基础知识+入门案例
SpringMVC基础知识 1.什么是Springmvc 2.springmvc 框架的原理(必须掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 3.SpringMVC 入门程序 目的:对 ...
- 虚拟机堆(Heap)的基础知识
概述 一个进程对应一个JVM实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核 ...
- java学习基础知识入门
基础入门知识(一) 一.java技术的分类 java按照技术标准和应用场景的不同分为三类,分别是JAVASE.JAVAEE.JAVAME JAVASE : 平台标准版,用于开发部署桌面,服务器以及嵌入 ...
- DOM0,DOM2,DOM3事件,事件基础知识入门
事件是javascript和HTML交互基础, 任何文档或者浏览器窗口发生的交互, 都要通过绑定事件进行交互; 事件有DOM0, DOM2和DOM3的区分(别问我怎么少了一个DOM1, 也没找到DOM ...
- java基础知识入门
一.java简介及原理图 Java的前世今生 Java之父詹姆斯·高斯林: 1967年, 12岁用报废的电话机和电视做了一台电子游戏机; 1983年, 获得卡内基梅隆大学计算机科学博士学位; 1983 ...
- 1 python大数据挖掘系列之基础知识入门
preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
随机推荐
- zigbee学习基础
应用场合:功耗(休眠)以及自组网(动态路由,梯度法寻径)是其特点.距离短.功耗低且传输速率不高的各种电子设备之间进行有周期性数据.间歇性数据和低反应时间数据传输的应用(智能家居/仓储中转/伞兵落地协同 ...
- kafka创建topic报错
kafka执行如下创建topic的语句: [root@node01 kafka_2.11-1.0.0]# bin/kafka-topics.sh --create --topic streaming- ...
- redhat7.6 DNS配置正向解析
1.安装DNS服务 yum install bind yum install bind-chroot 安装完的配置文件/etc/named.conf 启动systemctl start named.s ...
- JUnit + Mockito 单元测试
原 JUnit + Mockito 单元测试(二) 2015年01月05日 17:26:02 sp42a 阅读数:60755 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- 六 Struts2访问Servlet的API方式一:完全解耦合的方式
注意: 完全解耦合的方式,这种方式只能获得代表request.session.application的数据的Map集合. 不能操作这些对象的本身的方法. 1 jsp: <%@ page lang ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:显示在 <abbr> 元素中的文本以小号字体展示,且可以将小写字母转换为大写字母
<!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...
- 解决EFCore缓存机制导致的数据查询错误问题
如题,在对同一个Context连续进行相同条件的查询时,会触发EFCore的缓存机制,如果这个过程中数据发生了变化,则会出现错误. 例如:有两个Context实例,一个负责查询,一个负责增删改, A_ ...
- 【剑指Offer面试编程题】题目1355:扑克牌顺子--九度OJ
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...
- Java基础 -2.6
String字符串 在任何语言里面 都没有提供所谓的字符串这种基本数据类型,但是从实际的使用上来讲呢,各个编程语言 为了方便程序的开发,也都会提供有字符串的相应描述 在进行字符串变量使用的时候也可以使 ...
- 如何往gitlab/github上游贡献代码
Git 是一个开源的分布式版本控制系统,它能够记录每一次改动. 一些概念 仓库:git 中以仓库为单位:每个项目对应一个仓库,如 /eayuntest/Rally./eayuntest/stack 是 ...