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数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
随机推荐
- 2018 最新注册码【激活码】、在线激活 pycharm 完整方法(亲测有效)【2018.06.01 重大更新!!!!】
2018-06-01修改如下: 原来方法的第二种还是有效的,操作如下 (1)更新hosts文件(可以直接下载,然后解压缩) host文件地址 hosts文件,在windows中的地址为: 替换host ...
- DNS域名解析服务(重点)
一 .DNS 系统的作用 1.DNS 服务器概述 DNS 系统在网络中的作用就是维护着一个地址数据库,其中记录了各种主机域名:与 IP地址的对应关系,以便为客户程序提供正向或反向的地址查询服务,即正 ...
- Android Studio 配置Gradle
一, 问题:①换个新电脑安装完Android Sutdio第一次打开一个工程巨慢怎么办?② 手动配置Gradle Home为什么总是无效?③ 明明已经下载了Gradle,配置了gradle home, ...
- 【Android多线程】Thread和线程池
https://www.bilibili.com/video/av65170691?p=3 (本文为此视频听课笔记) 一.为什么要使用多线程 二.Thread 2.1 通过继承Thread类 2.2 ...
- WPF 体系结构
转载地址:http://blog.csdn.net/changtianshuiyue/article/details/38963477 本主题提供 Windows Presentation Found ...
- Verilog状态机
以1011为例 代码如下: //1011(Meay型) module state1(clk,in,rst_n,out); input clk; input rst_n; input in; outpu ...
- python 基础之深浅拷贝
深浅拷贝 s=[[1,2],'fgfgf','cx'] s3=s.copy() print(s) print(s3) 测试 D:\python\python.exe D:/untitled/dir/f ...
- 【转】PowerDesigner数据库视图同时显示Code和Name
1.按顺序打开: Tools>>>Display Preference 2.依次点击 选中Code打钩,并点击箭头指向图标把Code置顶 3.最终效果图 原文链接
- onContextItemSelected 与 onMenuItemSelected 的那些事
Android 的activity中onCreateOptionsMenu onMenuItemSelected onOptionsItemSelected onCreateContextMenu o ...
- awk及sum求和!
awk 也是一个强大的编辑工具,它比 sed 的功能更加强大,可以在无交互的情况下实现相当复杂的文本操作. 1.awk 的语法 awk [选项] ' print $1' 文件名 选项 -F指定分隔符 ...