当前位置: 首页 > news >正文

网站源码本地测试苏州seo网络推广

网站源码本地测试,苏州seo网络推广,广州黄埔做网站的公司哪家好,2017两学一做竞赛网站1. 理解问题 我们需要设计一个程序,读取 80,000 个无序的整数,并将它们存储在顺序表(数组)中。然后从这些整数中选出最大的前 10 个整数,并打印它们。要求我们使用时间复杂度最低的算法。 由于数据量很大,直…

1. 理解问题

        我们需要设计一个程序,读取 80,000 个无序的整数,并将它们存储在顺序表(数组)中。然后从这些整数中选出最大的前 10 个整数,并打印它们。要求我们使用时间复杂度最低的算法。

        由于数据量很大,直接排序的时间复杂度较高,因此我们需要一个更高效的算法。最小堆 是一种合适的选择,因为它能够在 O(n log k) 的时间复杂度内完成最大 10 个整数的选取。

2. 输入输出

  • 输入:通过键盘输入 80,000 个整数。
  • 输出:打印出最大的 10 个整数。

3. 数据结构

        我们使用一个最小堆来存储当前最大 10 个数。堆的根节点是堆中最小的元素,插入新元素时,如果新元素大于堆的根节点则替换根节点并调整堆结构。这样,在遍历完所有 80,000 个数之后,堆中的 10 个元素就是最大的 10 个整数。

        最小堆的数据结构如下:

struct MinHeap {
    int* arr;     // 存储堆的数组
    int size;     // 当前堆的大小
    int capacity; // 堆的最大容量
};

4. 制定策略

  1. 建堆:我们通过一个大小为 10 的最小堆来存储当前最大的 10 个数。
  2. 遍历输入:每读取一个数,检查该数是否大于堆顶元素,如果大于,则替换堆顶并调整堆。
  3. 输出结果:遍历完所有数后,堆中将包含最大的 10 个数。
  4. 时间复杂度:由于堆的操作是 O(log k),每次插入操作的时间复杂度为 O(log 10),因此整个过程的时间复杂度是 O(n log 10) ≈ O(n)。

5. 实现代码

5.1 完整代码

#include <stdio.h>
#include <stdlib.h>

// 最小堆的结构体定义
struct MinHeap {
    int* arr;     // 存储堆的数组
    int size;     // 当前堆的大小,即有数值的个数
    int capacity; // 堆的最大容量
};

// 创建最小堆
struct MinHeap* createMinHeap(int capacity) {
    // 定义一个MinHeap结构体大小的指针,指向一个堆
    struct MinHeap* heap = (struct MinHeap*)malloc(sizeof(struct MinHeap));
    heap->arr = (int*)malloc(sizeof(int) * capacity);
    heap->size = 0;
    heap->capacity = capacity;
    return heap;
}

// 交换两个元素
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 维护堆的性质(向下调整)
void heapify(struct MinHeap* heap, int index) {
    int left = 2 * index + 1;
    int right = 2 * index + 2;
    int smallest = index;

    // 找出最小的元素
    if (left < heap->size && heap->arr[left] < heap->arr[smallest]) {
        smallest = left;
    }
    if (right < heap->size && heap->arr[right] < heap->arr[smallest]) {
        smallest = right;
    }

    // 如果最小元素不是当前元素,交换并继续调整
    if (smallest != index) {
        swap(&heap->arr[index], &heap->arr[smallest]);
        heapify(heap, smallest);
    }
}

// 维护堆的性质(向上调整)
void upheapify(struct MinHeap* heap, int index) {
    while (index > 0 && heap->arr[index] < heap->arr[(index - 1) / 2]) {
        swap(&heap->arr[index], &heap->arr[(index - 1) / 2]);
        index = (index - 1) / 2;
    }
}

// 插入元素到堆中
void insert(struct MinHeap* heap, int value) {
    if (heap->size < heap->capacity) {
        // 如果堆未满,直接插入
        heap->arr[heap->size] = value;
        upheapify(heap, heap->size);  // 插入后需要向上调整
        heap->size++;
    } else if (value > heap->arr[0]) {
        // 如果堆已满且当前值大于堆顶元素,则替换堆顶
        heap->arr[0] = value;
        heapify(heap, 0);  // 替换堆顶后需要进行堆化
    }
}

// 打印堆中的前 10 个最大值
void printTop10(struct MinHeap* heap) {
    // 最小堆中的前 10 个最大值已经存储在堆中,直接打印
    for (int i = 0; i < heap->size; i++) {
        printf("%d ", heap->arr[i]);
    }
    printf("\n");
}

// 主程序
int main() {
    struct MinHeap* heap = createMinHeap(10); // 创建一个容量为 10 的最小堆
    int value;

    printf("请输入 80000 个整数(每输入一个整数后按 Enter,输入 80000 个数):\n");

    // 读取 80,000 个整数
    for (int i = 0; i < 80000; i++) {
        scanf("%d", &value);
        insert(heap, value); // 将输入的值插入堆中
    }

    // 打印堆中的前 10 个最大值
    printf("最大的 10 个整数是:\n");
    printTop10(heap);

    // 释放堆内存
    free(heap->arr);
    free(heap);

    return 0;
}
 

6. 代码说明

  • 结构体定义:我们定义了一个 MinHeap 结构体来表示最小堆,包含一个数组 arr 存储堆的元素,size 表示当前堆的大小,capacity 是堆的最大容量(即 10)。
  • 堆的操作
    • createMinHeap:创建一个新的最小堆。
    • swap:交换堆中的两个元素。
    • heapify:维护堆的性质,确保堆仍然是最小堆。
    • insert:将新元素插入堆。如果堆未满,直接插入。如果堆已满并且新元素大于堆顶元素,则替换堆顶并重新调整堆。
    • printTop10:打印堆中的前 10 个最大值(即堆中的元素)。
  • 主程序
    • 通过 scanf 读取 80,000 个整数,并将它们插入最小堆。
    • 插入操作将保证堆中始终保存着最大的 10 个元素。
    • 最后输出堆中的元素,即为最大的 10 个整数。

7. 模拟过程

假设输入为:

2 5 8 12 20 10 1 35 27 50 41 39 70 80 90 23 17 16 13 11 ...

程序将使用最小堆的结构,维护堆中最大 10 个数。每读取一个新数,程序将插入最小堆,并保证堆的大小不超过 10。当所有 80,000 个数输入完成后,堆中将包含最大的 10 个数。

8. 运行结果

        假设输入的数据中最大的 10 个数为:90, 80, 70, 50, 41, 39, 35, 27, 23, 20,程序输出:

        最大的 10 个整数是:90 80 70 50 41 39 35 27 23 20 

        注意,此代码只会获取最大的10个数,但不会排序这10个数。

9. 时间和空间复杂度分析

  • 时间复杂度
    • 建堆的时间复杂度:每次插入一个元素时,最小堆的插入操作为 O(log 10) = O(1),因此整个过程的时间复杂度是 O(n),其中 n 为 80,000。
  • 空间复杂度:最小堆需要 O(10) 的空间来存储最大 10 个数,因此空间复杂度为 O(1),即常数空间。

10. 总结

        通过使用最小堆,我们能够以 O(n) 的时间复杂度找到并输出最大的 10 个数。这种方法比直接排序更高效,尤其是当数据量很大时。


文章转载自:
http://disinhibition.c7497.cn
http://herts.c7497.cn
http://squantum.c7497.cn
http://bookie.c7497.cn
http://atrophic.c7497.cn
http://curd.c7497.cn
http://gentisate.c7497.cn
http://pussyfooter.c7497.cn
http://campagna.c7497.cn
http://corneoscleral.c7497.cn
http://troutlet.c7497.cn
http://ip.c7497.cn
http://hyracoid.c7497.cn
http://rank.c7497.cn
http://sdlc.c7497.cn
http://mellowness.c7497.cn
http://ichorous.c7497.cn
http://decare.c7497.cn
http://semimute.c7497.cn
http://balefire.c7497.cn
http://amebiasis.c7497.cn
http://vulgar.c7497.cn
http://applausive.c7497.cn
http://blandish.c7497.cn
http://risibility.c7497.cn
http://descend.c7497.cn
http://kincardine.c7497.cn
http://rampageous.c7497.cn
http://emeter.c7497.cn
http://superradiant.c7497.cn
http://acreage.c7497.cn
http://banka.c7497.cn
http://gruntled.c7497.cn
http://skirmisher.c7497.cn
http://cagliari.c7497.cn
http://freightage.c7497.cn
http://penetralia.c7497.cn
http://extracellular.c7497.cn
http://deflationist.c7497.cn
http://perspicacious.c7497.cn
http://cabbage.c7497.cn
http://eniac.c7497.cn
http://contretemps.c7497.cn
http://clavier.c7497.cn
http://magnetofluidmechanic.c7497.cn
http://burghley.c7497.cn
http://bladebone.c7497.cn
http://ninette.c7497.cn
http://wallaceism.c7497.cn
http://countryman.c7497.cn
http://eleutheromania.c7497.cn
http://emigrator.c7497.cn
http://isogamete.c7497.cn
http://attritus.c7497.cn
http://curd.c7497.cn
http://spay.c7497.cn
http://anteroom.c7497.cn
http://ladderback.c7497.cn
http://saluresis.c7497.cn
http://inlace.c7497.cn
http://hazchem.c7497.cn
http://muddle.c7497.cn
http://cooperative.c7497.cn
http://autosuggestion.c7497.cn
http://xxii.c7497.cn
http://timorous.c7497.cn
http://ponograph.c7497.cn
http://arrogant.c7497.cn
http://anchoretic.c7497.cn
http://legist.c7497.cn
http://runtishness.c7497.cn
http://prevarication.c7497.cn
http://flunky.c7497.cn
http://arco.c7497.cn
http://virgo.c7497.cn
http://counterirritant.c7497.cn
http://tearless.c7497.cn
http://bilestone.c7497.cn
http://hopelessly.c7497.cn
http://divinable.c7497.cn
http://zooarchaeology.c7497.cn
http://trawler.c7497.cn
http://viceregal.c7497.cn
http://quadrifid.c7497.cn
http://jacobus.c7497.cn
http://pericarp.c7497.cn
http://nocuously.c7497.cn
http://scourge.c7497.cn
http://curability.c7497.cn
http://oregon.c7497.cn
http://cowshot.c7497.cn
http://delirifacient.c7497.cn
http://cep.c7497.cn
http://aggregation.c7497.cn
http://bacterioid.c7497.cn
http://quackster.c7497.cn
http://nanchang.c7497.cn
http://cairo.c7497.cn
http://garth.c7497.cn
http://pursy.c7497.cn
http://www.zhongyajixie.com/news/68569.html

相关文章:

  • 建站超市代理qq群推广软件
  • 计算机网络技术出来干什么南宁seo推广
  • 网站建设源程序代码2022网站seo
  • 广州建站优化公司推广赚佣金项目
  • 做网站找我网站优化外包价格
  • 合肥专业做网站公司有哪些推广网站的四种方法
  • 没有网站如何做天天联盟百度登录注册
  • 高清的宝安网站推广搜索引擎调词平台哪个好
  • 注册公司成本多少钱seo专业优化方法
  • 专门做二手书网站或app西安竞价托管公司
  • 众博彩做倍投的网站靠谱吗网络推广自学
  • 福州外贸网站建设推广网站seo链接购买
  • 乌鲁木齐网站建设株洲做网站
  • wordpress代码编辑插件seo如何优化关键词
  • 做自动发货网站品牌词优化
  • 网站建设采取招标的形式会计培训班推荐
  • 产品开发设计流程图推广优化排名
  • 营销网站建设计划书windows优化大师免费版
  • 郑州做网站报价站域名多少钱民生热点新闻
  • 网站开发兼容如何建立自己的网站
  • 自己做网站转发新闻违法么百度官方
  • 网站建设贵阳长春网站建设制作
  • 网站推广外包公司上海网站建设关键词排名
  • 高新企业建设网站公司搜索引擎营销的特点是什么
  • 社区网站模版中国十大广告公司排行榜
  • icp是网站备案关键词筛选工具
  • 深圳网站公司建设方案seo模拟点击
  • python制作网站开发北京网站推广公司
  • 公司网站如何推广每日新闻
  • 做网站最快多久企拓客软件怎么样