C#,数值计算——堆选择(Heap Select)的计算方法与源程序

1 简述

HeapSelect 是一种用于选择数组中第 K 个最大元素的算法。它是选择问题的变体,涉及在无序或偏序集合中查找特定元素。

算法概要:数组被转换为最大堆,然后反复删除根节点并替换为下一个最大的元素,直到找到第 K 个最大的元素。

2 Heapselect


We saw a randomized algorithm with n + O(log n) comparison expected. Can we get the same performance out of an unrandomized algorithm?
Think about basketball tournaments, involving n teams. We form a complete binary tree with n leaves; each internal node represents an elimination game. So at the bottom level, there are n/2 games, and the n/2 winners go on to a game at the next level of the tree. Assuming the better team always wins its game, the best team always wins all its games, and can be found as the winner of the last game.

(This could all easily be expressed in pseudo code. So far, it's just a complicated algorithm for finding a minimum or maximum, which has some practical advantages, namely that it's parallel (many games can be played at once) and fair (in contrast, if we used algorithm min above, the teams placed earlier in L would have to play many more games and be at a big disadvantage).

Now, where in the tree could the second best team be? This team would always beat everyone except the eventual winner. But it must have lost once (since only the overall winner never loses). So it must have lost to the eventual winner. Therefore it's one of the log n teams that played the eventual winner and we can run another tournament algorithm among these values.

If we express this as an algorithm for finding the second best, it uses only n + ceil(log n) comparisons, even better than the average case algorithm above.

If you think about it, the elimination tournament described above is similar in some ways to a binary heap. And the process of finding the second best (by running through the teams that played the winner) is similar to the process of removing the minimum from a heap. We can therefore use heaps to extend idea to other small values of k:

    heapselect(L,k)
    {
    heap H = heapify(L)
    for (i = 1; i < k; i++) remove min(H)
    return min(H)
    }
The time is obviously O(n + k log n), so if k = O(n/log n), the result is O(n). Which is interesting, but still doesn't help for median finding.

3 C#源程序

using System;

namespace Legalsoft.Truffer
{
    public class Heapselect
    {
        private int m { get; set; }
        private int n { get; set; }
        private int srtd { get; set; }
        private double[] heap { get; set; }

        public Heapselect(int mm)
        {
            this.m = mm;
            this.n = 0;
            this.srtd = 0;
            this.heap = new double[mm];
            for (int i = 0; i < mm; i++)
            {
                heap[i] = 1.0E99;
            }
        }

        public void add(double val)
        {
            if (n < m)
            {
                heap[n++] = val;
                if (n == m)
                {
                    Array.Sort(heap);
                }
            }
            else
            {
                if (val > heap[0])
                {
                    heap[0] = val;
                    for (int j = 0; ;)
                    {
                        int k = (j << 1) + 1;
                        if (k > m - 1)
                        {
                            break;
                        }
                        if (k != (m - 1) && heap[k] > heap[k + 1])
                        {
                            k++;
                        }
                        if (heap[j] <= heap[k])
                        {
                            break;
                        }
                        Globals.SWAP(ref heap[k], ref heap[j]);
                        j = k;
                    }
                }
                n++;
            }
            srtd = 0;
        }

        public double report(int k)
        {
            int mm = Math.Min(n, m);
            if (k > mm - 1)
            {
                throw new Exception("Heapselect k too big");
            }
            if (k == m - 1)
            {
                return heap[0];
            }
            if (srtd == 0)
            {
                Array.Sort(heap);
                srtd = 1;
            }
            return heap[mm - 1 - k];
        }
    }
}
 

4 可参考的C 代码

/************************************************************************ Author: Isai Damier* Title: Find the Greatest k values* Project: geekviewpoint* Package: algorithms** Statement:*   Given a list of values, find the top k values.** Time Complexity: O(n log n)* * Sample Input: {21,3,34,5,13,8,2,55,1,19}; 4* Sample Output: {19,21,34,55}* * Technical Details: This selection problem is a classic and so has*   many very good solutions. In fact, any sorting algorithm can be*   modified to solve this problem. In the worst case, the problem*   can indeed be reduced to a sorting problem: where the collection*   is first sorted and then the element at indices 0 to k-1 are*   retrieved.*   *   Presently the problem is solved using a modified version of*   heapsort called heapselect.**********************************************************************/public int[] heapselectTopK(int[] G, int k) {int last = G.length - 1;//convert array to heap in O(n)int youngestParent = last / 2;//l = 2*p+1: p=(l-1)/2for (int i = youngestParent; i >= 0; i--) {moveDown(G, i, last);}//sort up to k (i.e. find the kth)int limit = last - k;for (int i = last; i > limit; i--) {if (G[0] > G[i]) {swap(G, 0, i);moveDown(G, 0, i - 1);}}return Arrays.copyOfRange(G, G.length - k, G.length);
}private void moveDown(int[] A, int first, int last) {int largest = 2 * first + 1;while (largest <= last) {if (largest < last && A[largest] < A[largest + 1]) {largest++;}if (A[first] < A[largest]) {swap(A, first, largest);first = largest;largest = 2 * first + 1;} else {return;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/78866.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP Socket 基础知识点(实例是以Java进行演示)

本篇根据TCP & Socket 相关知识点和学习所得进行整理所得。 文章目录 前言1. TCP相关知识点1.1 双工/单工1.2 TCP协议的主要特点1.3 TCP的可靠性原理1.4 报文段1.4.1 端口1.4.2 seq序号1.4.3 ack确认号1.4.4 数据偏移1.4.5 保留1.4.6 控制位1.4.7 窗口1.4.8 校验和1.4.9 紧…

Rocky(centos) jar 注册成服务,能开机自启动

概述 涉及&#xff1a;1&#xff09;sh 无法直接运行java命令&#xff0c;可以软连&#xff0c;此处是直接路径 2&#xff09;sh脚本报一堆空格换行错误&#xff1a;需将转成unix标准格式&#xff1b; #切换到上传的脚本路径 dos2unix 脚本文件名.sh 2&#xff09;SELINUX …

日期格式化的最佳实践:如何在Java中处理日期格式化

文章目录 前言一、使用format()方法二、使用注解JsonFormat三、使用消息转换器1.定义用户类2.重写DateSerializer 方法3.定义对象映射器&#xff1a;4.定义消息转换器5.调用测试 总结 前言 当涉及到日期格式化时&#xff0c;了解正确的方式和最佳实践是至关重要的。 日期格式化…

传感器与卡尔曼滤波器融合

一、介绍 自动驾驶汽车配备了多个传感器&#xff0c;如摄像头、雷达、激光雷达等。如下图所示&#xff0c;所有传感器都有一些优点和缺点。但是&#xff0c;如果您融合不同传感器的输出&#xff0c;那么它们在任何天气条件下都不会失效。 以下是有关它们在不同任务和天气条件下…

Docker-Compose编排与部署(lnmp实例)

第四阶段 时 间&#xff1a;2023年8月3日 参加人&#xff1a;全班人员 内 容&#xff1a; Docker-Compose编排与部署 目录 一、Docker Compose &#xff08;一&#xff09;概述 &#xff08;二&#xff09;Compose适用于所有环境&#xff1a; &#xff08;三&#xf…

前端页面--视觉差效果

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><link rel"stylesheet" href"https://un…

Spring中Bean的生命周期

Spring中Bean的生命周期可以分为5个阶段&#xff1a; 对象实例化。 属性赋值。 初始化&#xff0c;看Bean实现了哪些接口&#xff0c;执行相应的方法&#xff0c;去包装对象&#xff0c;使对象的功能增强。 将bean对象放入到容器中。 销毁Bean。

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Linux文本处理工具和正则表达式

Linux文本处理工具和正则表达式 一.查看、截取和修改文本的工具 1.查看文本的工具 cat 最常用的文件查看命令&#xff1b;当不指明文件或者文件名为一杠’-时&#xff0c;读取标准输入。 cat [OPTION]... [FILE]... -A&#xff1a;显示所有控制符(tab键:^I;行结束符:$) -…

【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板13

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

pygame贪吃蛇游戏

pygame贪吃蛇游戏 贪吃蛇游戏通过enter键启动&#xff0c;贪吃蛇通过WSAD进行上下左右移动&#xff0c;每次在游戏区域中随机生成一个食物&#xff0c;每次吃完食物后&#xff0c;蛇变长并且获得积分&#xff1b;按空格键暂停。 贪吃蛇 import random, sys, time, pygame from …

【小沐学前端】GitBook制作在线电子书、技术文档(gitbook + Markdown + node)

文章目录 1、简介1.1 工具简介1.2 使用费用 2、安装2.1 安装node2.2 安装gitbook 3、测试3.1 编辑文档3.2 编译工程3.3 预览工程 结语 1、简介 官网地址&#xff1a; https://www.gitbook.com/1.1 工具简介 什么是 GitBook&#xff1f; GitBook 是一个现代文档平台&#xff…

【雕爷学编程】Arduino动手做(190)---MAX4466声音模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

安装zabbix5.0监控

官网安装手册&#xff1a; https://www.zabbix.com/cn/download 一、 安装zabbix a. 安装yum源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpmyum clean allb. 安装Zabbix server&#xff0c;web前端&#xff0c;agent y…

【【萌新的STM32 学习-6】】

萌新的STM32 学习-6 BSP 文件夹&#xff0c;用于存放正点原子提供的板级支持包驱动代码&#xff0c;如&#xff1a;LED、蜂鸣器、按键等。 本章我们暂时用不到该文件夹&#xff0c;不过可以先建好备用。 CMSIS 文件夹&#xff0c;用于存放 CMSIS 底层代码&#xff08;ARM 和 ST…

【Python】Pandas 简介,数据结构 Series、DataFrame 介绍,CSV 文件处理,JSON 文件处理

序号内容1【Python】Pandas 简介&#xff0c;数据结构 Series、DataFrame 介绍&#xff0c;CSV 文件处理&#xff0c;JSON 文件处理2【Python】Pandas 数据清洗操作&#xff0c;常用函数总结 文章目录 1. Pandas 简介2. Pandas 数据结构1. Series&#xff08;一维数据&#xff…

Pandas 的Merge函数详解

在日常工作中&#xff0c;我们可能会从多个数据集中获取数据&#xff0c;并且希望合并两个或多个不同的数据集。这时就可以使用Pandas包中的Merge函数。在本文中&#xff0c;我们将介绍用于合并数据的三个函数 merge、 merge_ordered、 merge_asofmerge merge函数是Pandas中…

算法练习--leetcode 数组

文章目录 爬楼梯问题裴波那契数列两数之和 [数组]合并两个有序数组移动零找到所有数组中消失的数字三数之和 爬楼梯问题 输入n阶楼梯&#xff0c;每次爬1或者2个台阶&#xff0c;有多少种方法可以爬到楼顶&#xff1f; 示例1&#xff1a;输入2&#xff0c; 输出2 一次爬2阶&a…

743. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

用 Gaussian Process 建模 state-action 空间相关性,加速 Multi-Fidelity RL

1 intro 利用相邻 state-action 的空间相关性来加速学习&#xff1a;通过 Gaussian Process&#xff08;GP&#xff09;作为函数逼近器。主要贡献&#xff1a;两个算法。 model-based MFRL 算法 GP-VI-MFRL&#xff0c;估计转换函数&#xff0c;然后使用 value iteration 计算…