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数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
随机推荐
- C++11常用特性介绍——decltype关键字
一.decltype的意义 有时我们只想从表达式的类型推断出要定义的变量类型,但是不想用其值进行初始化的时候,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在 ...
- java编译问题之Description Resource Path Location Type Java compiler level does not match the version of
project 编译问题,需要三处的jdk版本要保持一致,才能编译通过. 1.在项目上右键properties->project Facets->修改右侧的version 保持一致 2. ...
- win10 安装"pip install orange3" 出现LINK : fatal error LNK1158: cannot run 'rc.exe' 错误的解决办法
解决办法: 从(本例使用的是64位的python3.6 注意:如果python的版本是32位,则使用x86:如果是64位,则使用x64;) 复制一下两个文件 rc.exe rcdll.dll 到
- C/C++网络编程7——多进程服务器端之fork函数
通过前面几节的内容,我们已经可以实现基本的C/S结构的程序了,但是当多个客户端同时向服务器端请求服务时,服务器端只能按顺序一个一个的服务,这种情况下,客户端的用户是无法忍受的.所以虚实现并发的服务器端 ...
- 《iOS开发实战 从入门到上架App Store(第2版)》书籍目录
第1章 开发准备 1.1 iOS 10新特性简述 1.1.1 新增触觉反馈编程接口 1.1.2 SiriKit框架的开放 1.1.3 引入Messages App 1.1.4 通知框架的整合与扩展 1 ...
- Tachyon---基于内存的分布式存储系统
Tachyon是一个以内存为核心的开源分布式存储系统,也是目前发展最迅速的开源大数据项目之一.Tachyon为不同的大数据计算框架(如Apache Spark,Hadoop MapReduce, Ap ...
- 笔记-twisted源码-import reactor解析
笔记-twisted源码-import reactor解析 1. twisted源码解析-1 twisted reactor实现原理: 第一步: from twisted.internet ...
- 算法复杂度图示&JavaScript算法链接
https://juejin.im/post/5c9a1d58e51d4559bb5c6694
- CODE 大全网站整站源码分享(带数据库)
CODE 大全是一个偏向于 JavaEE.JavaWeb,WEB 前端,HTML5,数据库,系统运维,编程技术开发的纯个人学习.交流性质的技术博客,一个很不错的网站,现在我免费分享给大家.对 java ...
- 腾讯玄武实验室向(CNVD)提交了一个重大漏洞“BucketShock”
导读 11 月 21 日,在小米 IoT 安全峰会上,腾讯安全玄武实验室负责人于旸(花名:TK 教主)在演讲中透露,腾讯玄武实验室最近向国家信息安全漏洞共享平台(CNVD)提交了一个重大漏洞“Buck ...