NodeJS实现堆排序算法

 NodeJS实现堆排序算法

以下是使用 Node.js 实现堆排序算法的示例代码:

// 堆排序函数
function heapSort(arr) {
    // 构建最大堆
    buildMaxHeap(arr);

    // 依次取出最大堆的根节点(最大值),并调整堆结构
    for (let i = arr.length - 1; i > 0; i--) {
        // 将当前根节点(最大值)与最后一个节点交换位置
        [arr[0], arr[i]] = [arr[i], arr[0]];
        
        // 调整堆,使剩余元素继续保持最大堆的性质
        heapify(arr, 0, i);
    }
}

// 构建最大堆
function buildMaxHeap(arr) {
    const n = arr.length;
    // 从最后一个非叶子节点开始依次向上调整堆
    for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
        heapify(arr, i, n);
    }
}

// 调整堆
function heapify(arr, i, heapSize) {
    const left = 2 * i + 1; // 左子节点索引
    const right = 2 * i + 2; // 右子节点索引
    let largest = i; // 记录最大值的索引

    // 如果左子节点存在且大于当前节点,则更新最大值索引
    if (left < heapSize && arr[left] > arr[largest]) {
        largest = left;
    }

    // 如果右子节点存在且大于当前节点,则更新最大值索引
    if (right < heapSize && arr[right] > arr[largest]) {
        largest = right;
    }

    // 如果最大值索引不等于当前节点索引,则交换当前节点与最大值节点的值,并递归调整堆
    if (largest !== i) {
        [arr[i], arr[largest]] = [arr[largest], arr[i]];
        heapify(arr, largest, heapSize);
    }
}

// 测试堆排序算法
const arr = [12, 11, 13, 5, 6, 7];
console.log('原始数组:', arr);

heapSort(arr);
console.log('排序后的数组:', arr);

这段代码定义了三个函数:heapSort 用于执行堆排序,buildMaxHeap 用于构建最大堆,heapify 用于调整堆的结构以保持最大堆的性质。然后通过 heapSort 函数对输入数组进行排序,并输出结果。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
协同过滤算法是一种推荐系统算法,它可以根据用户的历史行为推荐给用户可能感兴趣的物品。下面是基于nodejs实现协同过滤算法的思路: 1. 首先需要收集用户对物品的评分数据,可以使用数据库或者文件存储。 2. 接着需要计算用户之间的相似度,常用的方法有欧几里得距离和皮尔逊相关系数。这里我们使用皮尔逊相关系数来计算用户之间的相似度。 3. 计算出每个用户的相似度后,就可以根据其他用户的评分数据来推荐物品了。常用的推荐方法有基于用户和基于物品两种。这里我们使用基于用户的推荐方法。 4. 实现基于用户的推荐方法需要为每个用户找到最相似的K个用户,然后选出这K个用户中的评分最高的物品作为推荐结果。 5. 最后需要将推荐结果呈现给用户。可以使用web应用程序或者命令行工具来实现。 下面是一个简单的基于nodejs实现协同过滤算法的代码示例: ```javascript // 加载依赖模块 const fs = require('fs'); const path = require('path'); const readline = require('readline'); // 定义用户评分数据文件路径 const DATA_PATH = path.resolve(__dirname, 'data.json'); // 定义需要推荐的用户和要推荐的物品数量 const RECOMMEND_USER = 'user1'; const RECOMMEND_SIZE = 5; // 读取用户评分数据 const data = JSON.parse(fs.readFileSync(DATA_PATH)); // 计算用户之间的相似度 function similarity(user1, user2) { let avg1 = 0, avg2 = 0, count = 0; for (let item in data[user1]) { if (item in data[user2]) { avg1 += data[user1][item]; avg2 += data[user2][item]; count++; } } if (count === 0) { return 0; } avg1 /= count; avg2 /= count; let numerator = 0, denominator1 = 0, denominator2 = 0; for (let item in data[user1]) { if (item in data[user2]) { numerator += (data[user1][item] - avg1) * (data[user2][item] - avg2); denominator1 += Math.pow(data[user1][item] - avg1, 2); denominator2 += Math.pow(data[user2][item] - avg2, 2); } } if (denominator1 === 0 || denominator2 === 0) { return 0; } return numerator / (Math.sqrt(denominator1) * Math.sqrt(denominator2)); } // 查找和指定用户最相似的K个用户 function similarUsers(user, k) { const users = []; for (let otherUser in data) { if (otherUser !== user) { users.push({ user: otherUser, similarity: similarity(user, otherUser) }); } } users.sort((a, b) => b.similarity - a.similarity); return users.slice(0, k); } // 为指定用户推荐物品 function recommend(user, k) { const candidates = {}; for (let otherUser of similarUsers(user, k)) { for (let item in data[otherUser.user]) { if (!(item in data[user])) { if (!(item in candidates)) { candidates[item] = { score: 0, count: 0 }; } candidates[item].score += data[otherUser.user][item] * otherUser.similarity; candidates[item].count++; } } } const recommendations = []; for (let item in candidates) { candidates[item].score /= candidates[item].count; recommendations.push({ item: item, score: candidates[item].score }); } recommendations.sort((a, b) => b.score - a.score); return recommendations.slice(0, RECOMMEND_SIZE); } // 将推荐结果打印到控制台 function printRecommendations(recommendations) { console.log(`Recommend ${RECOMMEND_SIZE} items for ${RECOMMEND_USER}:`); for (let result of recommendations) { console.log(`- ${result.item} (score: ${result.score.toFixed(2)})`); } } // 读取用户输入并执行推荐操作 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('Please enter user ID: ', (user) => { const recommendations = recommend(user, 3); printRecommendations(recommendations); rl.close(); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值