c语言桶排序对链表,关于算法:如果我们使用链表实现存储桶,存储桶排序的复杂度如何为O(n + k)?...

2023-10-27

我很好奇,如果我们使用通过链表实现的存储桶,为什么存储桶排序的运行时间为O(n + k)。 例如,假设我们有以下输入:

n = no of element= 8

k = range = 3

array = 2,2,1,1,1,3,1,3

桶将如下所示:

1: 1 -> 1 -> 1 -> 1

2: 2 -> 2

3: 3 -> 3

假设我们将尾指针存储在链接列表中,则插入这些存储桶所花费的总时间为O(n)。

要删除,我们必须转到每个存储桶,然后删除该存储桶中的每个节点。 因此,当我们遍历每个链表时,复杂度应为O(K *桶链表的平均长度)。

但是,我读到存储桶排序的复杂度为O(n + k)。 为什么这与我的分析不一致? 请纠正我,因为我仍在学习计算复杂性。

"删除"是什么意思? 为什么在排序过程中需要删除?

我的意思是复制到原始Arary

为什么将存储桶实现为链接列表。 此列表中的所有元素都是相同的(即存储区索引),因此您只保留存储区中的项目数,而不保留每个元素。

请查看我的问题中的修改内容,即为什么我要这样实现

@Howard,具有相同键的项可能不会始终具有相同的元素标识,例如,如果哈希函数是h(x):x? x mod(256)

您的分析几乎是正确的,但是您缺少一个重要的细节。

现在,您是正确的,遍历输入数组以将元素分布到存储桶中需要时间O(n)。但是,当您说组装数组所需的总时间为O(k *(每个存储桶中的平均元素数))时,您的情况会稍微有些偏离。请注意,由于存在n个元素和k个存储桶,因此总运行时间为O(n),这将得出O(k *(n / k))= O(n)。要了解为什么真正的答案是O(n + k),我们需要更仔细地看一下big-O项。

对于初学者,您绝对正确,您在每个存储分区上花费的平均时间为O(n / k)。然后,您说由于有k个存储桶,因此总运行时间为O(k *(n / k))= O(n)。但是,这是不正确的:特别是k * O(n / k)= O(n)并非正确。其原因是,项O(n / k)隐藏了一个常数因子。当您访问每个存储桶并查看其中包含的元素时,它并不需要精确的n / k时间,甚至不需要n / k时间的某个常数倍。例如,如果存储桶为空会怎样?在那种情况下,您仍然要花一些时间在存储桶上,因为您必须确定不应迭代其元素。因此,每个存储桶所需时间的更准确表示类似于c 0 sub>(n / k)+ c 1 sub>,其中c 0 sub>和c 1 sub>是特定于实现的常量。该表达式当然是O(n / k)。

当您将此表达式乘以k以获取完成的工作总量时,就会发生问题。如果你计算

k * (c0(n / k) + c1)

你得到

c0n + c1k

如您所见,该表达式直接取决于k,因此总运行时间为O(n + k)。

获得此结果的更直接方法是查看存储桶排序第二步的代码,如下所示:

For each bucket b:

For each element x in b:

Append x to the array.

总体上需要完成多少工作?嗯,有k个不同的存储桶,因此最外面的循环至少需要O(k)时间,因为我们必须查看每个存储桶。在内部,内部循环将总共执行O(n)次,因为整个存储桶中共有n个元素。由此,我们得到O(n + k)的总运行时间。

这样做很重要的原因是,这意味着如果您尝试对数量众多的存储桶(例如,大于n)进行存储桶排序,则运行时可能会受到扫描所有存储桶以寻找所需时间的支配您实际使用的存储桶,即使其中大多数都是空的。基数排序之所以有用,是因为它使用了多个存储桶排序迭代,其中只有两个存储桶,它们的运行时间为O(n + 2)= O(n)。由于您只需要对此进行O(lg U)次迭代(其中U是数组中的最大值),因此运行时为O(n lg U)而不是从存储桶中获得的O(n + U)排序,这更糟。

希望这可以帮助!

我不明白如何logU迭代是数组中的最大值?

@ MrA-如果U是数组中的最大数字,则其中只有O(log U)位。 (考虑一下以10为基数的数字,其中N中的位数大约为log10 N)。 基数排序通过一次对一个数字进行排序而起作用,因此,数字中每个数字仅需要进行一次迭代,因此我们得到仅需要O(log U)迭代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言桶排序对链表,关于算法:如果我们使用链表实现存储桶,存储桶排序的复杂度如何为O(n + k)?... 的相关文章

  • 运行报错Parsing error: The keyword ‘import‘ is reserved

    问 运行报错Parsing error The keyword import is reserved 答 分析 这是因为我们还没有在配置文件 eslintrc中配置parserOptions来指定语言版本为和模块类型 在 eslintrc添
  • uniapp 微信小程序webview 踩坑

    uniapp 微信小程序的存在许多功能上的限制和约束 有些情况不得不去使用webview进行开发实现需求 比如 原生无法满足 例如某团队维护SDK 只提供了WEB端jsSDK 且不维护小程序SDK H5可以同时适用多端 适用范围更广 H5可
  • 13LinuxC线程学习之利用pthread_create设置线程分离属性和相关属性解释

    1 线程属性 1 本节作为指引性介绍 linux下线程的属性是可以根据实际项目需要 进行设置 之前我们讨论的线程都是采用线程的默认属性 默认属性已经可以解决绝大多数开发时遇到的问题 如我们对程序的性能提出更高的要求那么需要设置线程属性 比如
  • java常用类之Math类--Java笔记

    Math类包含的一些用于数学运算的静态方法 1 abs 绝对值 System out println 1 t Math abs 10 2 pow 求幂 System out println 2 t Math pow 10 2 3 ceil
  • 什么是PROFINET?PROFINET支持哪些通信方式?

    什么是PROFINET PROFINET 通讯是一种新的以太网通讯系统 是由西门子公司和Profibus用户协会开发 PROFINET具有多制造商产品之间的通讯能力 自动化和工程模式 并针对分布式智能自动化系统进行了优化 其应用结果能够大大
  • F-Measure MCC ROC Area PRC Area_MCC学生会

    传媒学院学生会 媒体运营部 水墨勾染纸笺 是山海的讯息 尘世浮华轮换 是星辰的轨迹 用笔尖筑起一座城 用光影编成一曲歌 我们是凡嚣之外的不同颜色 抬眼看花开花落 云卷云舒 红霞满天 千种美景 万缕愁思 卷携着落日 我想把无数次的擦肩而过和这
  • python3GUI--在线小说播放器By:PyQt5(附ui源码)

    文章目录 一 准备工作 1 PyQt5 2 qtawesome 3 QMediaPlayer 4 LAVFilters 二 预览 1 启动 2 查看小说详情 播放小说 3 搜索后播放 4 动态演示 三 设计流程 1 UI设计 2 整体流程设
  • pycharm自带python解释器吗,如何设置默认PyCharm解释器?

    My PyCharm installation has two interpreters available Python 3 3 2 usr bin python3 3m Python 2 7 5 usr bin python2 7 Wh
  • docker获取镜像image id命令_Docker之镜像和容器基础操作命令

    本篇文章是介绍镜像 image 和 容器 container 的基础操作命令 后直接使用英文 image 和 container 替代 首先来讲解释一下 image 和 container 的关系 image 概念 image 就是我们从
  • Blender 建模案例一(1)

    目录 1 指环 1 1 创建一个柱体 1 2 柱体微调 1 3 缩放 1 4 应用缩放 1 5 物体属性回归默认 1 6 进入编辑模式 1 7 内插面 1 8 桥接循环边 1 9 添加表面细分修改器 1 10 平滑着色 1 11 添加环切
  • LTH7锂电池充电IC

    LTH7是一个完善的单片锂离子电池恒流 恒压线形电源管理芯片 它薄的尺寸和小的外包装使它便于便携应用 更值得一提的是 LTH7专门设计适用于USB的供电规格 得益于内部的MOSFET 结构 在应用上不需要外部电阻 和阻塞二极管 在高能量运行
  • libsvm相关变量总结以及libsvm 参数粗调、微调技巧 和PCA主成分分析princomp函数的使用

    libsvm搭建的支持向量机运行起来 在命令行里会蹦出很多变量 开始的时候 我不以为意 现在想想这样糊弄 到最后还是稀里糊涂 不如一次总结 当做日后的复习资料 运行起来会出现这些 1 变量总结 optimization finished i
  • 点击移除样式,再点击新增样式jq代码

    点击增加样式 再点击移除样式的jq function exam back click function if exam back hasClass exam modf5 exam back removeClass exam modf5 el
  • 什么是ui/ux

    目录 前言 1 图形元素 2 布局 3 颜色和视觉效果 4 动画和过渡效果 5 6 用户体验 User Experience UX 7 响应式设计 Responsive Design 8 可用性 Usability 9 信息架构 Infor
  • python firefly 游戏引擎 教程(一) 程序入口

    程序基本结构 程序的基本流程 firefly 基本程序流程如上所示 首先通过master模块分别启动 gate 网关 db 数据库相关 net 网络 chat 聊天 game 游戏逻辑 模块 然后各个模块分别调用initconfig进行初始
  • 入门指南:深入解析OpenCV的copyTo函数及其与rect的应用场景

    文章目录 导言 copyTo函数的示例 copyTo函数与rect的应用场景 结论 导言 OpenCV是一个功能强大的开源计算机视觉库 广泛应用于图像处理和计算机视觉任务 在OpenCV中 copyTo函数是一个重要的图像处理函数 它允许我
  • JAVA-final关键字和接口

    1 Final 关键字 final 关键字代表最终的 不可改变的 final 可以修饰变量 包括类属性 对象属性 局部变量和形参 方法 包括类方法和对象方法 和类 final修饰类 即代表它不能有儿子类 不能被继承 final修饰类 方法
  • Matlab 中 global 全局变量用法

    用法 在主函数里面 你需要设置 a 这个变量是一个全局变量 就需要声明一下 global a 然后在子函数里面你又用到了 a 这个全局变量 你需要在子函数里面再次声明 global a 这样在子函数中 就可以使用 a 这个全局变量了 不用在
  • 插入数据库喊单双引号解决方案(python)

    记录一下最近在写python 将数据持久化时 数据含单引号 双引号问题 数据库中有这样一张表 CREATE TABLE test test id INT NOT NULL AUTO INCREMENT article VARCHAR 45

随机推荐