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数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
随机推荐
- Linux 命令中 which、whereis、locate 命令的用法
which 命令 which 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置.它一般用来确认系统中是否安装了指定的软件. (1)命令格式 which 可执行文件名称 wherei ...
- PLSQL报错: ORA-12170:TNS connect timeout occurred
本人的问题已解决,先在安装oracle的服务器上黑窗口输入tnsping,提示说no listener,这是监听服务没有打开. 打开服务后还是不行,最后原因是服务器的网络有防火墙的问题,关掉防火墙连接 ...
- 「CTSC2008」网络管理
「CTSC2008」网络管理 传送门 整体二分做法,应该和这题一样的吧. 就是把序列换成树,第 \(k\) 小换成第 \(k\) 大. 然后就切了... 参考代码: #include <algo ...
- NSObject类的API介绍
这篇文章围绕的对象就是NSObject.h文件,对声明文件中的属性.方法进行必要的“翻译”. 该文件大致由两部分组成:NSObject协议和NSObject类. (一)NSObject协议 - (BO ...
- 第五周之Hadoop学习(五)
在上周已经完成Hadoop的Java编程环境下的配置,这周则是通过对Eclipse的环境编程对Hadoop的API进行简单的调用 参考地址:https://blog.csdn.net/u0105237 ...
- [Misc] ZSH 常用快捷键
安装 zsh 终端执行 brew install zsh 终端执行 vim ~/.bash_profile 命令,打开 .bash_profile 文件 如果没有 vim,请自行安装 在打开的文件中, ...
- gitlab相关命令操作
[root@xuegod63 ~]# git config --global user.name "zsl3"[root@xuegod63 ~]# git config --glo ...
- LoadRunner的参数化
好久不用loadrunner,以前的东西又都还给百度了,今天心血来潮,把参数化搞了一下 Action() { web_url("WebTours", "URL=http: ...
- pycharm自定义代码段
PyCharm使用技巧:Live Templates(快速输入自定义代码片段):链接
- SpringBoot Controller找不到视图路径
在启动类加注解@ComponentScan("com.controller")即可,括号里表示Controller所在包名. 参考:https://blog.csdn.net/ji ...