我需要优化我的算法来计算数组(未排序)中的大/小/相等数字,而不是给定数字。
我必须做很多次,并且给定数组也可以有数千个元素。
数组没有变化,数字正在变化
示例:
数组:1,2,3,4,5
n = 3
首先想到:
遍历数组并检查元素是否为>或者<或==比n。 的为O(n * K)
O((n + k)* logn)
首先对数组进行排序(im使用c qsort),然后使用二进制搜索找到相等的数字,然后以某种方式计算越来越小的值。但是怎么做呢?
如果元素存在(bsearch返回指向元素的指针),我还需要检查数组是否包含这些元素的可能重复(所以我需要在这些元素之前和之后检查它们等于找到的元素),然后使用一些指针操作来计算更大和更小的值。 如何使用指向相同元素的指针获得更大/更小的值的数量? 但是,如果我找不到该值(bsearch返回null)该怎么办?
答案 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)
由于数组(显然是?)没有变化,因此预先排序。这允许二进制搜索(Log(n))
a。)实现你自己的bsearch版本(无论如何都会减少代码)
b。)因为你说你想要计算匹配数,你暗示数组可以包含多个具有相同值的条目(否则你将使用布尔值has_n)。
c。)为了进一步优化(以内存为代价),您可以将数据排序为结构的二叉搜索树,不仅包含值,还包含每个值之前和之后的计数和值数。如果你有很多重复值,它可能根本不会使用更多的内存,但没有数据集就很难分辨。
在没有描述您隐藏的算法和数据的代码或至少足够的描述(除了推荐数据结构和算法的课程或课程)之前,我可以提供帮助。