出现次数的TOP K问题

【题目】
给定String类型的数组strArr,再给定整数k,请严格按照排名
顺序打印出现次数前k名的字符串。
【要求】
如果strArr长度为N,时间复杂度请达到O(Nlogk)。

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <map>
#define MinData -100000 
using namespace std;
typedef struct HeapStruct *MinHeap;
map<string, int> m; 
struct HeapStruct {
	int *Elems;
	int size;
	int cap; 
};

MinHeap Create(MinHeap H, int Maxsize) {
	H = (MinHeap) malloc (sizeof(struct HeapStruct));
	H->Elems = (int*) malloc (sizeof(int) * (Maxsize + 1));
	H->size = 0;
	H->Elems[0] = MinData;
	H->cap = Maxsize;
	return H; 
}

int IsFull(MinHeap H) {
	if (H->size == H->cap) {
		return 1;
	} else {
		return 0;
	}
}

int IsEmpty(MinHeap H) {
	if (H->size == 0) {
		return 1;
	} else {
		return 0;
	}
}

void Insert(MinHeap H, int x) {
	int i;
	if (IsFull(H)) {
		printf("堆已满");
		return;
	}
	i = ++H->size;
	H->Elems[i] = x;
	for (; x < H->Elems[i / 2]; i /= 2) {
		H->Elems[i] = H->Elems[i / 2];
	}
	H->Elems[i] = x; 
}

int dele(MinHeap H) {
	int parent, child;
	int temp, MinItem;
	if (IsEmpty(H)) {
		printf("堆为空");
		return 0;
	}
	MinItem = H->Elems[1];
	temp = H->Elems[H->size--];
	for (parent = 1; parent * 2 <= H->size; parent = child) {
		child = parent * 2;
		if ((child + 1) <= H->size && (H->Elems[child + 1] < H->Elems[child])) {
			child++;
		}
		if (H->Elems[child] >= temp) break;
		else {
			H->Elems[parent] = H->Elems[child];
		}
	}
	H->Elems[parent] = temp;
	return MinItem;
}

int main() {
	int a[3];
	MinHeap H;
	string s[6];
	H = Create(H, 3);
	for (int i = 0; i < 6; i++) {
		cin >> s[i];
		m[s[i]]++;
	}
	
	
	for(map<string, int>::iterator iter = m.begin(); iter != m.end(); iter++)    
    {    
        if (H->size < 3) {
        	Insert(H, iter->second);
		} else {
			if (iter->second > H->Elems[1]) {
				dele(H);
				Insert(H, iter->second);
			}
		}   
    }
        
	/*
	for (int i = 3; i < 6; i++) {
		if (m[s[i]] < H->Elems[1]) {
			dele(H);
			Insert(H, m[s[i]]);
		}
	}*/
	/*
	for(int i = 0; i < 3; i++) {  
        int temp = dele(H);  
        printf("%d ", temp);      
    }*/ 
  
	for (int i = 0; i < 3; i++) {
		a[i] = dele(H);
		//printf("%d ", a[i]);
	}
	
	for (int i = 2; i >= 0; i--) {
		printf("%d ", a[i]);
	}
	return 0;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值