”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在 JavaScript 中使用最小和最大堆管理流数据:数字运动员健康技术视角

在 JavaScript 中使用最小和最大堆管理流数据:数字运动员健康技术视角

发布于2024-11-06
浏览:923

Managing Streaming Data with Min and Max Heaps in JavaScript: A Digital Athlete Health Tech Perspective

数据管理在健康技术中至关重要。无论是跟踪运动员的表现指标还是监控运动员的恢复时间,有效地组织数据都可以对洞察的获取方式产生重大影响。在这种情况下管理数据的一种强大工具是堆,特别是最小堆和最大堆。在这篇文章中,我们将使用与运动员数据管理相关的实际示例,探讨如何在 JavaScript 中实现和使用最小堆和最大堆。

什么是堆?

堆是一种特殊的基于二叉树的数据结构,满足堆属性。在最小堆中,父节点始终小于或等于其子节点。相反,在 max heap 中,父节点始终大于或等于其子节点。这使得堆对于从数据集中有效检索最小值或最大值特别有用。

最小堆用例:跟踪恢复时间

想象一下,您是一名临床医生,正在跟踪运动员锻炼后的恢复时间。您希望有效地跟踪最短的恢复时间,以便您可以快速识别哪位运动员恢复最快。

创建最小堆

在 JavaScript 中,您可以使用数组创建最小堆,并使用简单的函数对其进行管理以维护堆属性:

class MinHeap {
    constructor() {
        this.heap = [];
    }

    getMin() {
        return this.heap[0];
    }

    insert(value) {
        this.heap.push(value);
        this.bubbleUp();
    }

    bubbleUp() {
        let index = this.heap.length - 1;
        while (index > 0) {
            let parentIndex = Math.floor((index - 1) / 2);
            if (this.heap[parentIndex] 



使用最小堆计算运动员恢复时间

现在,让我们将其应用到我们的场景中:

const recoveryTimes = new MinHeap();
recoveryTimes.insert(10); // Athlete A
recoveryTimes.insert(7);  // Athlete B
recoveryTimes.insert(12); // Athlete C

console.log("Fastest recovery time:", recoveryTimes.getMin()); // Outputs: 7

在这里,最小堆允许临床医生快速识别恢复时间最快的运动员,这对于在训练期间做出实时决策至关重要。

最大堆用例:监控峰值性能指标

另一方面,最大堆非常适合需要跟踪最高值的场景,例如监控峰值性能指标,例如在剧烈锻炼期间达到的最大心率。

创建最大堆

最大堆的实现方式与最小堆类似,但需要进行一些调整:

class MaxHeap {
    constructor() {
        this.heap = [];
    }

    getMax() {
        return this.heap[0];
    }

    insert(value) {
        this.heap.push(value);
        this.bubbleUp();
    }

    bubbleUp() {
        let index = this.heap.length - 1;
        while (index > 0) {
            let parentIndex = Math.floor((index - 1) / 2);
            if (this.heap[parentIndex] >= this.heap[index]) break;
            [this.heap[parentIndex], this.heap[index]] = [this.heap[index], this.heap[parentIndex]];
            index = parentIndex;
        }
    }

    extractMax() {
        if (this.heap.length === 1) return this.heap.pop();
        const max = this.heap[0];
        this.heap[0] = this.heap.pop();
        this.bubbleDown();
        return max;
    }

    bubbleDown() {
        let index = 0;
        const length = this.heap.length;
        const element = this.heap[0];

        while (true) {
            let leftChildIndex = 2 * index   1;
            let rightChildIndex = 2 * index   2;
            let leftChild, rightChild;
            let swap = null;

            if (leftChildIndex  element) swap = leftChildIndex;
            }

            if (rightChildIndex  element) ||
                    (swap !== null && rightChild > leftChild)
                ) {
                    swap = rightChildIndex;
                }
            }

            if (swap === null) break;
            [this.heap[index], this.heap[swap]] = [this.heap[swap], this.heap[index]];
            index = swap;
        }
    }
}

使用最大堆实现峰值心率

让我们考虑如何使用最大堆来跟踪运动员在锻炼期间的峰值心率:

const heartRates = new MaxHeap();
heartRates.insert(150); // Athlete A
heartRates.insert(165); // Athlete B
heartRates.insert(160); // Athlete C

console.log("Peak heart rate:", heartRates.getMax()); // Outputs: 165

在这里,最大堆确保临床医生可以快速识别达到最高心率的运动员,这可能表明需要进一步关注或冷却。

其他基本堆操作

除了插入元素和检索最小值或最大值之外,堆还支持其他基本操作,例如:

  • 提取最小/最大:这会删除堆的根(最小堆中的最小元素或最大堆中的最大元素)并重新平衡堆。
  • Heapify:将任意数组转换为堆,确保堆属性得到维护。
  • Peek:查看最小值或最大值,而不将其从堆中删除。

这些操作对于实时有效管理和处理数据至关重要,使堆成为健康技术应用中的宝贵工具。

简化 Python 和 JavaScript 中的堆操作

在Python中,heapq模块提供了一种简单有效的方法来使用列表来管理最小堆。这是一个例子:

import heapq

# Create an empty list to represent the heap
recovery_times = []

# Add elements to the heap
heapq.heappush(recovery_times, 10)  # Athlete A
heapq.heappush(recovery_times, 7)   # Athlete B
heapq.heappush(recovery_times, 12)  # Athlete C

# Retrieve the smallest element (fastest recovery time)
fastest_recovery_time = heapq.heappop(recovery_times)
print(f"Fastest recovery time: {fastest_recovery_time}")  # Outputs: 7

对于JavaScript,虽然没有内置的堆模块,但您可以使用@datastructs-js/priority-queue等第三方库来实现类似的功能:

// First, you would need to install the @datastructures-js/priority-queue library using npm:
// npm install @datastructures-js/priority-queue

const { MinPriorityQueue } = require('@datastructures-js/priority-queue');

// Create a new min heap
const minHeap = new MinPriorityQueue();

// Add elements to the heap
minHeap.enqueue(10); // Athlete A
minHeap.enqueue(7);  // Athlete B
minHeap.enqueue(12); // Athlete C

// Retrieve the smallest element
const fastestRecoveryTime = minHeap.dequeue().element;
console.log("Fastest recovery time:", fastestRecoveryTime); // Outputs: 7

通过利用这些工具,您可以专注于应用程序的关键方面,例如分析运动员数据,而不必陷入堆实现的细节中。

在 JavaScript 中高效检索数据

堆,特别是最小堆和最大堆,是在 JavaScript 中有效管理和检索关键数据的强大工具。无论您是跟踪恢复时间还是监控峰值性能指标,这些结构都可以帮助临床医生和健康技术专业人员快速做出明智的决策。通过理解和实施堆,您可以确保您的运动员数据井然有序、可访问并准备好在最重要的时候进行分析。

通过在健康技术应用程序中使用堆,您将能够以支持运动员获得更好结果的方式处理数据,提供优化表现和恢复所需的见解。

版本声明 本文转载于:https://dev.to/adg29/managing-streaming-data-with-min-and-max-heaps-in-javascript-a-digital-athlete-health-tech-perspective-3d7g?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-07-05
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-07-05
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-07-05
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。要简化过程,建议将JSON作为数组而不是对象解析。执行此操作,将JSON_DECODE函数与第二个参数设置为true:[&&&&& && &&&&& json = JSON = JSON_DECODE($ j...
    编程 发布于2025-07-05
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-07-05
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-07-05
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-07-05
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-07-05
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-07-05
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c 的函数时,接受成员函数指针的函数时,必须同时提供对象的指针,并提供指针和指针到函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此)和成员函数指针。这可以通过修改Menubutton :: SetButton()(如下所示:[&& && && &&华)...
    编程 发布于2025-07-05
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-07-05
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-07-05
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-07-05
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-07-05
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    编程 发布于2025-07-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3