首页 文章

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

提问于
浏览
1

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

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

数组不会改变,数字也在变化

例:

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

n = 3

  • <:2的数量

  • 的数量:2

  • = =的数量:1

First thought:

遍历数组并检查元素是否>或<或==而不是n . O(n*k)

可能的优化:

O((n+k) * logn)

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

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

2 回答

  • 1

    如果数组未排序,并且其中的数字没有其他有用的属性,则无法击败一次行走数组的O(n)方法,并计算三个存储桶中的项目 .

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

    另一方面,如果您需要针对同一组数字运行多个查询,则排序将有所帮助 . 针对n个数的k个查询的定时将从O(n * k)进行k个线性搜索,假设为线性时间排序,或O((n k) * log2n),具有基于比较的排序 . 给定足够大的k,平均查询时间将减少 .

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

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

    • 你可以使用索引与指针进行内联

    • 您不需要指向专用函数的函数指针

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

    • 这意味着你需要对"n"数组的开头和结尾进行线性搜索 .

    • 您可以从中计算小于n且大于n的数字 .

    • 看来你有一些不成文的算法来选择这些(对于n = 3,你要找的值大于2且等于1的数量,所以没有办法给出具体的代码)

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

    • 如果没有描述隐藏算法和数据的代码,或者至少有足够的描述(除了推荐数据结构和算法的课程或课程)之外,我可以提供帮助 .

相关问题