0
点赞
收藏
分享

微信扫一扫

[BJDCTF2020]ZJCTF,不过如此1

三千筱夜 2023-12-06 阅读 49
数据结构

在这里插入图片描述

首先我们来看到这个方法的时间复杂度,我们先取前k个数据建立一个小堆,后面插入的数据依次与堆顶对比,比堆顶小就不进入堆,比堆顶大就代替堆顶进入堆,在进行向下调整。时间复杂度为O(N*logK)。

创造随机数,存入文件:

void CreateNDate()
{
	// 造数据
	int n = 10000000;
	srand(time(0));
	const char* file = "data.txt";
	FILE* fin = fopen(file, "w");
	if (fin == NULL)
	{
		perror("fopen error");
		return;
	}

	for (int i = 0; i < n; ++i)
	{
		int x = (rand() + i) % 10000000;
		fprintf(fin, "%d\n", x);
	}

	fclose(fin);
}

我们来看看如何建堆:

void PrintTopK(const char* file, int k)
{
	FILE* fout = fopen(file, "r");
	if (fout == NULL)
	{
		perror("fopen error");
		return;
	}

	// 建一个k个数小堆
	int* minheap = (int*)malloc(sizeof(int) * k);
	if (minheap == NULL)
	{
		perror("malloc error");
		return;
	}

	// 读取前k个,建小堆
	for (int i = 0; i < k; i++)
	{
		fscanf(fout, "%d", &minheap[i]);
		AdjustUp(minheap, i);
	}

	int x = 0;
	while (fscanf(fout, "%d", &x) != EOF)
	{
		if (x > minheap[0])
		{
			minheap[0] = x;
			AdjustDown(minheap, k, 0);
		}
	}

	for (int i = 0; i < k; i++)
	{
		printf("%d ", minheap[i]);
	}
	printf("\n");

	free(minheap);
	fclose(fout);
}

测试代码:

int main()
{
	 CreateNDate();
	PrintTopK("Data.txt", 5);

	return 0;
}

在这里插入图片描述

如果我们在文件中改入几个大于1000万的数进行测试:
在这里插入图片描述

那么我们放入的数据就打印出来了。最后感谢大家的支持!

举报

相关推荐

0 条评论