当前位置: 首页 > news >正文

注册公司代理费用/百度网站优化方案

注册公司代理费用,百度网站优化方案,厦门官方网站建设,辽宁丹东建设厅网站堆 heap,一棵完全二叉树,使用数组实现的,但具备完全二叉树的一些性质。一般总是满足以下性质: 堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。(即除了最底层,其他层…

heap,一棵完全二叉树,使用数组实现的,但具备完全二叉树的一些性质。一般总是满足以下性质:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。(即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入)

堆一般分为以下两种形式:

  • 大根堆:根节点的值最大,每个节点都大于等于其子树中所有节点的值
  • 小根堆:根节点的值最小,每个节点都小于等于其子树中所有节点的值

两者的总体架构相同,不同的只是元素之间的比较规则

堆的入队和出队的时间复杂度都是O(log n)

在PriorityQueue中,最高优先级的元素总是位于队列的前面,即堆的根节点。(默认是数字越小,优先级越高),常用方法:

  • peek()方法:获取队列中优先级最高的元素
  • poll()方法:从队列中删除并返回优先级最高的元素
  • add()方法:向队列中添加元素
  • remove()方法:移除队列中的某个元素(数组中从左到右的第一个)
  • size()方法:返回当前堆中的元素个数
  • clear()方法:清空堆中的元素,重置堆

PriorityQueue底层使用最小堆来实现,能够自动维护堆的性质。

在实现堆的过程中,通常使用数组来存储堆元素,并通过一些算法实现堆的插入、删除等操作。

小根堆

数组递归实现小根堆

import java.util.*;public class MinHeap {private int[] heap;     //用于实现堆的数组private int size;       //当前数组中最后一个元素的索引private int maxSize;    //总数组长度public MinHeap(int maxSize) {this.maxSize = maxSize;this.size = 0;//从索引为1的位置存储堆中的元素heap = new int[this.maxSize + 1];heap[0] = Integer.MIN_VALUE;}// 获取传入元素的父元素private int parent(int pos) {return pos / 2;}// 获取传入元素的左子元素private int leftChild(int pos) {return 2 * pos;}// 获取传入元素的右子元素private int rightChild(int pos) {return (2 * pos) + 1;}//判断是否是叶子结点private boolean isLeaf(int pos) {return pos > (size / 2) && pos <= size;}//交换位置private void swap(int pos1, int pos2) {int tmp = heap[pos1];heap[pos1] = heap[pos2];heap[pos2] = tmp;}//小根堆化,对传入的元素作为父节点的子树进行重构,用于在插入或删除元素后重新调整堆以保持小根堆的性质private void minHeapify(int pos) {if (!isLeaf(pos)) {//不是叶子结点//如果父元素比左子元素或右子元素大if (heap[pos] > heap[leftChild(pos)] || heap[pos] > heap[rightChild(pos)]) {//交换父元素和两子节点中较小的那个元素,然后重构对应的子树if (heap[leftChild(pos)] < heap[rightChild(pos)]) {swap(pos, leftChild(pos));minHeapify(leftChild(pos));} else {swap(pos, rightChild(pos));minHeapify(rightChild(pos));}}}}//向堆中插入元素public void insert(int element) {if (size >= maxSize) {return;}heap[++size] = element;int current = size;//插入的元素比对应的父元素小,交换位置,不断向上重构while (heap[current] < heap[parent(current)]) {swap(current, parent(current));current = parent(current);}}//获取最小的元素,将最后一个元素放入到原最小元素的位置,然后重构public int extractMin() {int popped = heap[1];heap[1] = heap[size--];minHeapify(1);return popped;}//不断根据父元素打印子节点的元素public void print() {for (int i = 1; i <= size / 2; i++) {System.out.print(" Parent: " + heap[i] + " Left child: " + heap[2 * i] + " Right child: " + heap[2 * i + 1]);System.out.println();}}public static void main(String[] args) {MinHeap minHeap = new MinHeap(10);minHeap.insert(5);minHeap.insert(3);minHeap.insert(17);minHeap.print();System.out.println("The Min val is " + minHeap.extractMin());}
}

数组非递归实现小根堆

import java.util.Arrays;public class MinHeap {private int[] heap;private int size;public MinHeap(int capacity) {heap = new int[capacity];size = 0;}public void insert(int val) {if (size == heap.length) {//如果空间不够则将数组的长度扩充一倍heap = Arrays.copyOf(heap, size * 2);}heap[size++] = val;int i = size - 1;while (i > 0 && heap[i] < heap[(i - 1) / 2]) {int temp = heap[i];heap[i] = heap[(i - 1) / 2];heap[(i - 1) / 2] = temp;i = (i - 1) / 2;}}public int pop() {if (size == 0) {throw new IllegalStateException("Heap is empty");}int root = heap[0];heap[0] = heap[--size];int i = 0;while (i * 2 + 1 < size) {int child = i * 2 + 1;//如果右节点存在而且比左节点小,则指向右节点,否则指向左节点if (child + 1 < size && heap[child + 1] < heap[child]) {child++;}if (heap[child] < heap[i]) {int temp = heap[i];heap[i] = heap[child];heap[child] = temp;i = child;} else {break;}}return root;}public boolean isEmpty() {return size == 0;}
}

在 insert() 方法中,先将元素插入数组末尾,然后将其上移至合适位置,直到父节点小于等于该元素或者该元素上移到根节点为止。在 pop() 方法中,将根节点弹出后,将数组末尾元素放置根节点处,然后将其下移至合适位置,直到子节点大于等于该元素或者该元素下移到叶子节点为止。

非递归实现,因此空间复杂度较递归实现会小一些,但是代码实现会更加复杂。

非递归实现中需要学习的还有:

抛出异常

if (size == 0) {throw new IllegalStateException("Heap is empty");
}

扩充堆大小

heap = Arrays.copyOf(heap, size * 2);

PriorityQueue实现小根堆

	public static void main(String[] args) {//可以直接使用PriorityQueue实现小根堆,因为PriorityQueue内部默认就是使用小根堆实现的//PriorityQueue<Integer> minHeap = new PriorityQueue<>();//传入了一个Comparator对象,重写了compare方法,使得PriorityQueue中的元素按照从小到大的顺序排列。PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {public int compare(Integer a, Integer b) {return a - b;}});minHeap.add(10);minHeap.add(20);minHeap.add(15);System.out.println("Smallest element: " + minHeap.peek());System.out.println("Removed element: " + minHeap.poll());System.out.println("New smallest element: " + minHeap.peek());}

小根堆的实现可以使用Java中的PriorityQueue类,只需要在创建PriorityQueue对象时传入一个Comparator对象,实现Comparator的compare方法来定义小根堆的比较方式。

大根堆

数组递归实现大根堆

import java.util.*;public class MaxHeap {private int[] heap;     //用于实现堆的数组private int size;       //当前数组中最后一个元素的索引private int maxSize;    //总数组长度public MaxHeap(int maxSize) {this.maxSize = maxSize;this.size = 0;//从索引为1的位置存储堆中的元素heap = new int[this.maxSize + 1];heap[0] = Integer.MAX_VALUE;}// 获取传入元素的父元素private int parent(int pos) {return pos / 2;}// 获取传入元素的左子元素private int leftChild(int pos) {return 2 * pos;}// 获取传入元素的右子元素private int rightChild(int pos) {return (2 * pos) + 1;}//判断是否是叶子结点private boolean isLeaf(int pos) {return pos > (size / 2) && pos <= size;}//交换位置private void swap(int pos1, int pos2) {int tmp = heap[pos1];heap[pos1] = heap[pos2];heap[pos2] = tmp;}//小根堆化,对传入的元素作为父节点的子树进行重构private void maxHeapify(int pos) {if (!isLeaf(pos)) {//不是叶子结点//如果父元素比左子元素或右子元素小if (heap[pos] < heap[leftChild(pos)] || heap[pos] < heap[rightChild(pos)]) {//交换父元素和两子节点中较小的那个元素,然后重构对应的子树if (heap[leftChild(pos)] > heap[rightChild(pos)]) {swap(pos, leftChild(pos));maxHeapify(leftChild(pos));} else {swap(pos, rightChild(pos));maxHeapify(rightChild(pos));}}}}//向堆中插入元素public void insert(int element) {if (size >= maxSize) {return;}heap[++size] = element;int current = size;//插入的元素比对应的父元素小,交换位置,不断向上重构while (heap[current] > heap[parent(current)]) {swap(current, parent(current));current = parent(current);}}//获取最小的元素,将最后一个元素放入到原最小元素的位置,然后重构public int extractMax() {int popped = heap[1];heap[1] = heap[size--];maxHeapify(1);return popped;}//不断根据父元素打印子节点的元素public void print() {for (int i = 1; i <= size / 2; i++) {System.out.print(" Parent: " + heap[i] + " Left child: " + heap[2 * i] + " Right child: " + heap[2 * i + 1]);System.out.println();}}public static void main(String[] args) {MaxHeap maxHeap = new MaxHeap(10);maxHeap.insert(5);maxHeap.insert(3);maxHeap.insert(17);maxHeap.print();System.out.println("The Max val is " + maxHeap.extractMax());}
}

PriorityQueue实现大根堆

	public static void main(String[] args) {// 传入了一个Comparator对象,重写了compare方法,使得PriorityQueue中的元素按照从大到小的顺序排列。PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {public int compare(Integer a, Integer b) {return b - a;}});maxHeap.add(10);maxHeap.add(20);maxHeap.add(15);System.out.println("Max element: " + maxHeap.peek());System.out.println("Removed element: " + maxHeap.poll());System.out.println("New Max element: " + maxHeap.peek());}
http://www.whsansanxincailiao.cn/news/32031372.html

相关文章:

  • 高端网站建设案例/揭阳百度seo公司
  • 电商设计的工作内容/北京优化seo排名优化
  • 工商营业执照网上申报/百度seo新规则
  • 万网网站搬家/百度提升排名
  • 万网免费网站/宁波网站建设推广平台
  • 新网站如何做流量/搜索引擎搜索器
  • 大型网站建设定制开发/金华网站推广
  • wordpress 摘要字数/seo零基础教学视频
  • 成都网站建设科技公司/网站优化是什么意思
  • wordpress会员打赏插件/新站seo外包
  • 怎样做个做外贸的网站/搜索引擎排名中国
  • 蚌埠百度做网站/郑州网站关键词优化公司哪家好
  • html5手机网站调用微信分享/如何注册一个域名
  • 湛江有人做网站 的吗/拉新任务接单放单平台
  • 泰兴市网站建设/关键词你们都搜什么
  • 找一个企业邮箱/seo搜索引擎优化期末考试
  • 笔记本做网站/佛山百度推广电话
  • 阿里云一键安装wordpress/seo外链发布平台有哪些
  • 做互联网营销一般上什么网站/搜索引擎营销优化
  • 现在最长用的做网站软件是什么/seo网络推广课程
  • 一家公司可以做几个网站/引擎搜索
  • 广州网站关键词优化推广/网络服务合同纠纷
  • wordpress电影网站/2345王牌浏览器
  • app在线生成网站/营销策划公司 品牌策划公司
  • 日用品网站1万2做代理/seo排名优化培训怎样
  • 泰安做网站建设的/搜索引擎营销的简称是
  • 大连模板网站制作推荐/现在如何进行网上推广
  • 哪些软件可以做网站设计/怎样打开网站
  • dw做的网站/百度投稿平台
  • 免费自助建站系统平台 贴吧/精准获客