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

台湾网站建设能让网络非常流畅的软件

台湾网站建设,能让网络非常流畅的软件,wordpress伪静态页文件夹,广州注册监理公司🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 堆的说明 2.0 堆的成员变量及其构造方法 3.0 实现堆的核心方法 3.1 实现堆的核心方法 - 获取堆顶元素 peek() 3.2 实现堆的核心方法 - 下潜 down(int i) 3.3 实…

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
  

 

文章目录

        1.0 堆的说明

        2.0 堆的成员变量及其构造方法 

        3.0 实现堆的核心方法

        3.1 实现堆的核心方法 - 获取堆顶元素 peek()

        3.2 实现堆的核心方法 - 下潜 down(int i)

        3.3 实现堆的核心方法 - 交换元素 swap(int i,int j)

        3.4 实现堆核心方法 - 删除堆顶元素 poll()

        3.5 实现堆的核心方法 - 替换堆顶元素 replace(int i)

        3.6 实现堆的核心方法 - 添加元素 offer(int value)

        3.7 实现堆的核心方法 - 建堆 heapify()

        3.8 实现堆的核心方法完整代码

        4.0 TOP - K 问题:最小的 K 个数

        4.1 实现最小 k 个数的思路

        4.2 代码实现最小 k 个数


        1.0 堆的说明

        堆(Heap)是一种基于树的数据结构,通常用于动态分配内存空间。堆可以被看作是一棵完全二叉树,其中每个节点都满足堆的性质,即父节点的值大于或等于子节点的值(大根堆),或父节点的值小于或等于子节点的值(小根堆)。在堆中,根节点的值是最大或最小的,因此也被称为最大堆或最小堆。

        堆的实现通常使用数组来存储堆中的元素通过计算数组下标来实现节点之间的关系。堆的时间复杂度为 O(log n),其中 n 是堆中元素的数量。

        堆的操作包括插入删除查找等。插入操作将一个新元素插入到堆中,删除操作将堆中的最大或最小元素删除,查找操作可以在堆中查找特定元素的位置。

        2.0 堆的成员变量及其构造方法 

        主要的成员变量为:int[] arr 数组:用来存放元素的容器;int size :代表当前的元素个数。

        构造方法:指定数组大小带参数的构造器参数为数组的构造器

代码如下:

public class MyHeap {public int[] arr;public int size;public MyHeap(int capacity) {arr = new int[capacity];}public MyHeap(int[] arr) {this.arr = arr;this.size = arr.length;heapify();}}

        

        3.0 实现堆的核心方法

        获取堆顶元素、下潜、交换元素、添加元素、替换元素、删除元素、建堆。

        3.1 实现堆的核心方法 - 获取堆顶元素 peek()

        用数组实现堆,在获取堆顶元之前,先需要判断该数组是否为空,若不为空,则直接返回数组索引为 0 的元素;若数组为空,则返回 0 或者抛出异常也可以。

代码如下:

    //获取栈顶元素public int peek() {if (isEmpty()) {return -1;}return arr[0];}

        3.2 实现堆的核心方法 - 下潜 down(int i)

        该方法主要用于删除栈顶元素、替换元素等核心方法。下潜的意思就是将当前的元素所在的位置不符合大顶堆或者小顶堆的规则,因此需要向下调整。找到合适的位置来存放当前的元素

 具体下潜的思路:

假设需要满足大顶堆的规则:

        由以上的图来看,当前的索引为 0 处的元素 7 小于该左孩子的元素,因此当前不满足大顶堆的规则。需要将两者进行交换。

交换的结果为:

        交换完之后,当前索引为 2 处的元素 7 小于该右孩子的元素,所以索引 2 与 索引 5 需要继续交换。若当前为 i 该右孩子的索引 left = 2 * i + 1;该左孩子的索引 right = 2 * i + 2 (也可以表示为 right = left + 1 )一开始默认当前的最大元素的索引 max = i ,接着来判断该左右孩子的元素是否大于当前索引 max ,若大于当前索引 max 时,需要进行交换 max = left 或者 max = right 。若不大于当前索引为 max 处的元素,则不需要交换。由于每一次都是子问题过程,所以可以利用递归来实现,当且仅当 max != i 时,说明 max 已经被交换过了,需要继续向下递出,直到 max == i 时,结束递出,开始回溯。当然,这里不需要回带任何值或者变量,即该递归函数的返回类型为 viod 。

代码如下:

    //下潜public void down(int i) {int left = 2 * i + 1;int right = left + 1;int max = i;if (left < size && arr[left] > arr[max]) {max = left;}if (right < size && arr[right] > arr[max]) {max = right;}if (max != i) {//交换swap(i,max);//继续下潜down(max);}}

        3.3 实现堆的核心方法 - 交换元素 swap(int i,int j)

        交换数组索引中 i 与 j 处的元素

代码如下:

    //交换public void swap(int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

        3.4 实现堆核心方法 - 删除堆顶元素 poll()

        具体实现思路:为了更高效率的删除堆顶元素后保持原来大顶堆或者小顶堆的规则。

        步骤一:先将堆顶元素与最后一个元素进行交换。即 arr[0] = arr[size - 1] 。

        步骤二:将 size-- 。

        步骤三:交换后的堆,可能会不满足大顶堆或者小顶堆的规则,则需要将堆顶元素进行下潜调整,找到合适的位置存放该元素。最后需要返回删除的元素。

代码如下:

    //删除堆顶元素public int poll() {if (isEmpty()) {return 0;}int t = arr[0];arr[0] = arr[size - 1];size--;//下潜down(0);return t;}

        注意:在删除堆顶元素之前,需要先判断当前的数组是否为空数组。

        同理,若需要删除指定堆中的元素索引,实现思路是一样的。

代码如下:

    //指定删除元素public int poll(int i) {if (i > size) {return 0;}int temp = arr[i];arr[i] = arr[size - 1];size--;//下潜down(i);return temp;}

        先判断索引是否合法,若不合法,则返回 0 或者抛出异常也可以。

        3.5 实现堆的核心方法 - 替换堆顶元素 replace(int i)

        具体思路为:先判断该数组是否为空数组,若不为空数组,则直接替换堆顶元素 arr[0] = i;之后可能会不满足大顶堆或者小顶堆的规则,所以索引为 0 处需要下潜调整,找到合适的位置存放元素。

代码实现:

    //替换堆顶元素public void replace(int i) {if (isEmpty()) {return;}arr[0] = i;down(0);}

        3.6 实现堆的核心方法 - 添加元素 offer(int value)

        具体实现思路:先判断当前索引为 i = size 处的双亲节点为 j = (i - 1) / 2 ,判断 arr[j] 与 value 的大小,若为大顶堆规则,则当 arr[j] > value 时,不需要继续往上走了,在 i 处存放 value 即可 arr[i] = value ;当 arr[j] <= value 时,先将 arr[j] 处的元素存放在 arr[i] 中,接着需要继续往上走, i = j ,j = (i - 1) / 2 直到 i == 0 或者 arr[j] > value 时,退出循环。在 arr[i] 处存放 value

代码如下:

    //添加元素public boolean offer(int value) {if (isFull()) {return false;}int i = size;int j = (size - 1) / 2;while (i > 0 && arr[j] < value) {arr[i] = arr[j];i = j;j = (i - 1) / 2;}arr[i] = value;size++;return true;}

        需要注意:添加元素前,需要先判断该数组是否满了。还有添加完之后,需要进行 size++

        3.7 实现堆的核心方法 - 建堆 heapify()

        该方法实现的意义,若随机给出一个数组,需要实现由大顶堆或者小顶堆的结构存放元素。因此就会用到该方法。

        实现思路为:需要找到最后一个非叶子节点,从后往前,将当前的元素进行下潜处理即可完成建堆。

代码如下:

    //建堆public void heapify() {//先找到最后非叶子节点int lastNonLeafNodes = size / 2 - 1;for (int i = lastNonLeafNodes; i >= 0 ; i--) {//下潜down(i);}}

        3.8 实现堆的核心方法完整代码

public class MyHeap {public int[] arr;public int size;public MyHeap(int capacity) {arr = new int[capacity];}public MyHeap(int[] arr) {this.arr = arr;this.size = arr.length;heapify();}//获取栈顶元素public int peek() {if (isEmpty()) {return -1;}return arr[0];}//删除堆顶元素public int poll() {if (isEmpty()) {return 0;}int t = arr[0];arr[0] = arr[size - 1];size--;//下潜down(0);return t;}//指定删除元素public int poll(int i) {if (i > size) {return 0;}int temp = arr[i];arr[i] = arr[size - 1];size--;//下潜down(i);return temp;}//替换堆顶元素public void replace(int i) {if (isEmpty()) {return;}arr[0] = i;down(0);}//添加元素public boolean offer(int value) {if (isFull()) {return false;}int i = size;int j = (size - 1) / 2;while (i > 0 && arr[j] < value) {arr[i] = arr[j];i = j;j = (i - 1) / 2;}arr[i] = value;size++;return true;}//建堆public void heapify() {//先找到最后非叶子节点int lastNonLeafNodes = size / 2 - 1;for (int i = lastNonLeafNodes; i >= 0 ; i--) {//下潜down(i);}}//下潜public void down(int i) {int left = 2 * i + 1;int right = left + 1;int max = i;if (left < size && arr[left] > arr[max]) {max = left;}if (right < size && arr[right] > arr[max]) {max = right;}if (max != i) {//交换swap(i,max);//继续下潜down(max);}}//交换public void swap(int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//判断是否为空数组public boolean isEmpty() {return size == 0;}//判断是否为满数组public boolean isFull() {return  size == arr.length;}
}

        4.0 TOP - K 问题:最小的 K 个数

题目:

        设计一个算法,找出数组中最小的k个数。以任意顺序返回这 k 个数均可。

示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

提示:

0 <= len(arr) <= 100000

0 <= k <= min(100000, len(arr))

OJ 链接:

面试题 17.14. 最小K个数

        4.1 实现最小 k 个数的思路

        具体思路为:结合大顶堆的数据结构的特点,根节点的元素永远比孩子节点的元素大。先将给定的 arr 数组的前 k 个元素直接通过 heap.offer() 方法添加到大顶堆上,然后 arr 数组剩下的元素需要跟堆顶元素相对比,若堆顶元素大于 arr[i] 中的元素,则需要进行交换,将 arr[i] 的元素替换到堆顶,接着还不能结束,有可能替换完的元素就不符合大顶堆的规则了,因此还需要将堆顶元素下潜处理调整,找到合适的位置存放该元素;若堆顶元素不大于 arr[i] 中的元素,则不需要交换。一直将 arr 数组中的元素遍历结束,则循环停止。最后堆上存储的 k 个元素就是该数组 arr 中最小的元素了。

        4.2 代码实现最小 k 个数

public class Solution {public int[] smallestK(int[] arr, int k) {MaxHeap heap = new MaxHeap(k);for(int i = 0; i < k ; i++) {heap.offer(arr[i]);}for(int i = k; i < arr.length; i++) {if(heap.peek() > arr[i]) {heap.arr[0] = arr[i];heap.down(0);}}return heap.arr;}}//实现一个大顶堆
class MaxHeap {int[] arr;int size;public MaxHeap(int capacity) {arr = new int[capacity];}public MaxHeap(int[] smallestK) {this.arr = smallestK;this.size = smallestK.length;}//插入元素public boolean offer(int value) {if(isFull()) {return false;}int i = size;int j = (i - 1) / 2;while(i > 0 && arr[j] < value) {arr[i] = arr[j];i = j;j = (i - 1) / 2;}arr[i] = value;size++;return true;}//删除堆顶元素public int poll() {if(isEmpty()) {return 0;}int ret = arr[0];arr[0] = arr[size - 1];size--;down(0);return ret;}//下潜public void down(int i) {int left = 2 * i + 1;int right = left + 1;int max = i;if(left < size && arr[left] > arr[max]) {max = left;}if(right < size && arr[right] > arr[max]) {max = right;}if(max != i) {swap(max,i);down(max);}}//交换public void swap(int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//获取堆顶元素public int peek() {if(isEmpty()) {return 0;}return arr[0];}//判断是否为空public boolean isEmpty() {return size == 0;}//判断是否为满public boolean isFull() {return size == arr.length;}}

http://www.hkea.cn/news/255307/

相关文章:

  • 制作公司网站价格腾讯广告代理商加盟
  • 大学生活动网站开发文案苏州seo门户网
  • 阿里云认证网站建设题库seo助理
  • 凤岗网站仿做靠谱seo外包定制
  • xampp安装wordpress说明徐州seo外包
  • 啥网站都能看的浏览器下载百度收录查询工具
  • 福田附近公司做网站建设哪家效益快奶糖 seo 博客
  • 临沂免费自助建站模板品牌整合营销
  • iis做本地视频网站找客户资源的网站
  • 做调查用哪个网站网络推广有多少种方法
  • 开发一个交易网站多少钱在线工具
  • 网站平台怎么建立的软文范例
  • 移动应用开发专业学什么东莞seo软件
  • 做宣传网站的公司手机百度极速版app下载安装
  • 私人可以做慈善网站吗外贸如何推广
  • 网站页面模板页面布局如何成为百度广告代理商
  • 瑞安外贸网站建设曲靖百度推广
  • 先做网站还是服务器销售营销方案100例
  • 用卫生纸做的礼物街网站免费网页空间到哪申请
  • 手游网站做cpc还是cpm广告号厦门网页搜索排名提升
  • 人个做外贸用什么网站好宁波百度seo点击软件
  • 诈骗网站怎么做的企业网站seo案例分析
  • 如何做网站接口湖南营销型网站建设
  • 进入兔展网站做PPt软文营销ppt
  • app网站新闻危机公关
  • 东莞关键词优化实力乐云seo南宁seo外包服务商
  • 做网站都是用源码么免费注册个人网站不花钱
  • 建设网站需要两种服务支持官网设计公司
  • 安庆做网站seo建站收费地震
  • 绵阳住房和城市建设局网站官网seo排名优化联系13火星软件