首页 > 编程语言 >手写topN算法-c语言

手写topN算法-c语言

时间:2023-12-31 10:44:53浏览次数:38  
标签:tmp int max void len topN 算法 bp 手写

#include <stdio.h>
#include <malloc.h>

struct TreeHeap {
    int v;
};

typedef struct TreeHeap TreeHeap;

static void print_bp(int bp[],int len);

void create_treeheap(TreeHeap *treeheap, int data[10],int bp[11])
{
    treeheap->v = 1;
    // from bottom to top adjust heap
    int i=0;
    for (i=0;i<10;i++)
    {
        bp[i+1] = data[i];
        if (i!=0)
        {   
            int j = i+1;
            while(j>1)
            {
                if (bp[j] > bp[j/2])  // todo 需要加上和邻居的对比,max(m,m+1)和m/2对比,大的在上面?
                {
                    int tmp = bp[j/2];
                    bp[j/2] = bp[j];
                    bp[j] = tmp;
                }
                j = j/2;
            }
        }
    }
}

void add_v(int bp[],int len,int v)
{
    int i=1;
    for (i=1;i<len;i++)
    {
        if (bp[i] == 0)
        {
            bp[i] = v;
            break;
        }
    }
    while (i>1)
    {
        if (bp[i] > bp[i/2])  // swap
        {
            int tmp = bp[i];
            bp[i] = bp[i/2];
            bp[i/2] = tmp;
        }
        i = i/2;
    }
}

void pull_top1(int bp[],int len)
{
    int i=1;
    printf("pop v %d\n",bp[1]);
    for (i=1;i<len;i++) 
    {
        if (bp[i]==0)
        {
            bp[1] = bp[i-1];
            bp[i-1]=0;
            break;
        }
    }
    int size = len-1;
    i = 1;
    // adjust heap
    while (bp[i] != 0 && i<=size/2)
    {   
        int max_child = bp[i*2] > bp[i*2+1] ? i*2 : i*2+1;
        if (bp[i] < bp[max_child])
        {
            int tmp = bp[i];
            bp[i] = bp[max_child];
            bp[max_child] = tmp;
            i=max_child;
        } else {
            printf("adjust done\n");
            break;
        }
        print_bp(bp,size);
        printf("\n");
    }
}

void pull_topN(int bp[],int len,int n)
{
    int i=1;
    for (i = 1;i<=n;i++)
    {
        pull_top1(bp,len);
    }
}

void print_bp(int bp[],int len)
{
    int i=1;
    for (i=1;i<len;i++)
    {
        if (bp[i] == 0) return;
        printf("%d ",bp[i]);
    }
}

void print_bp(int bp[],int len, bool add_newline)
{
    print_bp(bp,len);
    if (add_newline)
    {
        printf("\n");
    }
}

int main(){
    // tree storage
    TreeHeap *treeheap = (TreeHeap *) malloc(sizeof(TreeHeap));
    int data[10] = {1,2,3,11,10,56,4,5,7,9};
    int bp[31] = {};
    create_treeheap(treeheap, data,bp);
    printf("初始堆\n");
    print_bp(bp,31);
    printf("\n");

    add_v(bp,31,10);
    printf("add 10\n");
    print_bp(bp,31);
    printf("\n");

    printf("pop 1\n");
    pull_top1(bp,31);
    print_bp(bp,31);
    printf("\n");
    
    printf("pop 1\n");
    pull_top1(bp,31);
    print_bp(bp,31);
    printf("\n");
    
    printf("add 10\n");
    add_v(bp,31,10);
    print_bp(bp,31);
    printf("\n");

    printf("top 3\n");
    pull_topN(bp,31,3);
    print_bp(bp,31);
    printf("\n");

    printf("add 1\n");
    add_v(bp,31,1);
    print_bp(bp,31);
    printf("\n");
    
    printf("top 3\n");
    pull_topN(bp,31,3);
    print_bp(bp,31);
    printf("\n");

    return 0;
}

 

标签:tmp,int,max,void,len,topN,算法,bp,手写
From: https://www.cnblogs.com/lightdb/p/17937284

相关文章

  • 算法学习Day18左下角的值,路径总和,构建二叉树
    #Day18左下角的值,路径总和,构建二叉树`ByHQWQF2023/12/30`##笔记***##513.找树左下角的值给定一个二叉树的**根节点**`root`,请找出该二叉树的 **最底层 最左边**节点的值。假设二叉树中至少有一个节点。**示例2:****输入:**\[1,2,3,4,null,5,6,null,null,7]**......
  • 【图论】最大势算法
    模板题FishingNet给定一个无向图,判断是否是弦图。\(1\leqn\leq1000\)。算法概述最大势算法(MCS),是一个用于求出无向图完美消除序列的算法。算法流程为:钦定一个集合\(S\)。每次找到任意一个与\(S\)中的点连边最多的点,加入\(S\),放在消除序列末尾。这样就可以......
  • 限流算法
    计数器在固定时间间隔内,处理请求有上限,请求超出部分丢弃。packagemainimport( "sync" "time" klog"k8s.io/klog/v2")typecounterRateLimiterstruct{ msync.Mutex startPartTimeint64 endPartTimeint64 maxCountint currCou......
  • DES加密算法优缺点大揭秘:为何它逐渐被取代?
    一、引言DES(DataEncryptionStandard)加密算法作为一种历史悠久的对称加密算法,自1972年由美国国家标准局(NBS)发布以来,广泛应用于各种数据安全场景。本文将从算法原理、优缺点及替代方案等方面,对DES加密算法进行全面解析。DES加密解密|一个覆盖广泛主题工具的高效在线平台(......
  • 垃圾回收算法-通用的分代垃圾回收机制
    垃圾回收算法-通用的分代垃圾回收机制  概要  分代垃圾回收机制,是基于这样一个事实:不同对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。  我们将对象分为三种状态:年轻代、年老代、永久代。同时,将处于不同状态的对象放......
  • 二分查找算法---java----黑马程序员算法
    1.二分查找算法给定的条件:给定的有序数组A查找目标值为target,其中A标记为 数组序号从0开始,其下标最大为数组长度-1.举例数组:5  14  22 30 31  41 44条件:i>j  i表示左边下标   j表示右边下标   i从5开始   j 从44开始思想:每次计算其......
  • AVR智能充电器PID算法程序
    资源文件列表AVR智能充电器PID算法程序/battery_charge.prj , 3596AVR智能充电器PID算法程序/battery_charge.pr~ , 3579AVR智能充电器PID算法程序/battery_charge.txt , 0AVR智能充电器PID算法程序/main.asm , 17395AVR智能充电器PID算法程序/main.c , 6285AVR智能充......
  • 08fdma数据通路加入sobel算法IP方案
    软件版本:vitis2021.1(vivado2021.1)操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!8.1概述    本文实验目的:1:掌握2个uifdma_dbufIP的同时使用,以及读写通道之间的同步设计2:实现1路数据实时显示......
  • 算法学习Day17二叉树迭迭迭迭代
    Day17迭迭迭迭代ByHQWQF2023/12/28笔记110.平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树_每个节点_的左右两个子树的高度差的绝对值不超过1。示例1:输入:root=[3,9,20,null,null,15,7]输出:true递归法......
  • 代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和
    一、110.平衡二叉树题目链接:LeetCode110.平衡二叉树学习:思路:后序遍历。实际上是由叶结点到根结点,若有一颗子树不是平衡二叉树,则直接返回给根结点二、257.二叉树的所有路径题目链接:LeetCode257.二叉树的所有路径学习:思路:递归+回溯。因为是线=先遍历根结点,然后遍历左孩......