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

时间:2018-01-17 16:51:57

标签: c arrays algorithm optimization binary-search

我需要优化我的算法来计算数组(未排序)中的大/小/相等数字,而不是给定数字。

我必须做很多次,并且给定数组也可以有数千个元素。

数组没有变化,数字正在变化

示例:

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

n = 3

  • &lt ;: 2
  • 的数量
  • 数量>:2
  • ==:1
  • 的数量

首先想到:

遍历数组并检查元素是否为>或者<或==比n。 的为O(n * K)

可能的优化:

O((n + k)* logn)

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

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

2 个答案:

答案 0 :(得分:2)

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

对数组进行排序后进行二分搜索并不比O(n)好,假设您采用的是时间上线性的排序算法(例如基数排序)。对于基于比较的排序,例如快速排序,时间将增加到O(n * log 2 n)。

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

答案 1 :(得分:1)

  1. 由于数组(显然是?)没有变化,因此预先排序。这允许二进制搜索(Log(n))

    a。)实现你自己的bsearch版本(无论如何都会减少代码)

    • 你可以使用索引与指针进行内联
    • 您不需要指向专门功能的函数指针

    b。)因为你说你想要计算匹配数,你暗示数组可以包含多个具有相同值的条目(否则你将使用布尔值has_n)。

    • 这意味着您需要对" n" s数组的开头和结尾进行线性搜索。
    • 您可以从中计算小于n且大于n的数字。
    • 看来你有一些不成文的算法来选择这些(对于n = 3,你要找的数值大于且小于2且等于1,所以没有办法给出具体的代码)

    c。)为了进一步优化(以内存为代价),您可以将数据排序为结构的二叉搜索树,不仅包含值,还包含每个值之前和之后的计数和值数。如果你有很多重复值,它可能根本不会使用更多的内存,但没有数据集就很难分辨。

  2. 在没有描述您隐藏的算法和数据的代码或至少足够的描述(除了推荐数据结构和算法的课程或课程)之前,我可以提供帮助。