c - 快速计算数组中较小/相等/较大元素的方法

标签 c arrays algorithm optimization binary-search

我需要优化我的算法以计算数组(未排序)中比给定数字更大/更小/相等的数字。

我必须多次执行此操作,并且给定的数组也可以包含数千个元素。

数组不变,数字在变

例子:

数组:1,2,3,4,5

n = 3

  • <数量:2
  • 数量>:2
  • 数量 ==:1

第一个想法:

遍历数组并检查元素是否大于 n 或 < 或 ==。 O(n*k)

可能的优化:

O((n+k) * logn)

首先对数组进行排序(我使用 c qsort),然后使用二进制搜索找到相等的数字,然后以某种方式计算较小和较大的值。但是该怎么做呢?

如果元素存在(bsearch 返回指向该元素的指针)我还需要检查数组是否包含此元素的可能重复项(因此我需要检查此元素之前和之后是否等于找到的元素),然后使用一些指针操作来计算更大和更小的值。 如何通过指向相等元素的指针获得更大/更小的值? 但是,如果找不到值(bsearch 返回 null)怎么办?

最佳答案

如果数组是未排序的,并且其中的数字没有其他有用的属性,则没有办法击败 O(n) 遍历数组一次并计算三个桶中的项目的方法。

假设您使用时间线性的排序算法(例如基数排序),对数组进行排序后进行二分查找不会比 O(n) 更好。对于基于比较的排序,例如快速排序,时间会增加到 O(n*log2n)。

另一方面,如果您需要针对同一组数字运行多个查询,则排序会有所帮助。针对 n 个数字的 k 个查询的时间将从 O(n*k) 到 O(n+k*log2n) 假设线性时间排序,或 O((n+k)*log2n) 与基于比较的排序。如果 k 足够大,平均查询时间会下降。

关于c - 快速计算数组中较小/相等/较大元素的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48306191/

相关文章:

java - 2D KD树和最近邻搜索

algorithm - 重心坐标下三角点检验的数值稳定性

c - GTK 不呈现所有用户界面

java - native JNI 文件无法在 Android Studio 中找到 Java 文件的路径

c - 服务器/客户端消息在 C 中传递

传递给具有不同签名的函数的数组

algorithm - 用于图像配准的恶魔算法(用于假人)

c - 如何预处理 ld 链接描述文件?

arrays - swift 3 结构数组 -> 转换到 NSObject -> 投回 => 崩溃

java - 增强的 for 循环无法为数组赋值 (Java)