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

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

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

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]删除
最新教程 更多>
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-06-09
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-06-09
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-06-09
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-06-09
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-06-09
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    的综合集合:在Java中介绍Java的Map.entry和SimpleEntry和SimpleEntry和SimpleEntry和SimpleEntry和SimpleEntry和SimpleEntry和SimpleEntry和SimpleEntry apry and Map。 地图。它具有两个通用...
    编程 发布于2025-06-09
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
    编程 发布于2025-06-09
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-06-09
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-06-09
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-06-09
  • Go语言如何动态发现导出包类型?
    Go语言如何动态发现导出包类型?
    与反射软件包中的有限类型的发现能力相反,本文探索了替代方法,探索了在Runruntime。go import( “ FMT” “去/进口商” ) func main(){ pkg,err:= incorter.default()。导入(“ time”) 如果err...
    编程 发布于2025-06-09
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-06-09
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-06-09
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-06-09
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-06-09

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

Copyright© 2022 湘ICP备2022001581号-3