我在Linux上编程C,我有一个大的整数数组,如何过滤它,find适合某些条件,例如值> 1789 &&值<2031的值。有什么办法做到这一点,我需要sorting这个数组第一?
我已经阅读了答案,并感谢大家,但是我需要在这个大arrays上多次做这样的过滤操作,不仅仅是一次。 那么每次最好的方法是一个接一个迭代呢?
通过POSIX tdelete()访问节点数据
Windows操作系统如何检测algorithm是否符合FIPS?
Windows资源pipe理器使用的sorting顺序中的第一个字符是什么?
首先对数组进行排序。 然后在每个查询做2个二进制搜索。 我假设查询会像 –
Find integers x such that a < x < b
第一个二进制搜索将找到元素的索引i ,使得Array[i-1] <= a < Array[i] ,第二个二元搜索将找到索引j ,使得Array[j] < b <= Array[j+1] 。 那么你想要的范围是[i,j] 。
这个算法的复杂度是O(NlogN)在预处理和O(N)每个查询如果你想迭代所有的元素和O(logN)每个查询,如果你只是要计算过滤元素的数量。
让我知道你是否需要在C语言中实现二进制搜索的帮助。在C语言中有一个名为binary_search()函数,在C ++ STL中有lower_bound()和upper_bound() 。
如果你想要做的唯一的事情是获得符合这个标准的值,那么迭代数组并检查每个值的条件( O(n)对O(nlogn) )会更快。 但是,如果您要对此数组执行多个操作,则最好对其进行排序。
您可以使用与源数组大小相同的最大堆实现。 用min-1值初始化它,并在数字进入时将值插入到最大堆中。第一个检查是查看要插入的数字是否大于第一个元素,如果不是,放弃它,如果是然后将其插入到数组中。 要获取数字列表,请阅读新数组中的所有数字,直到min-1 。
要过滤数组,您必须查看每个元素一次。 不需要多次查看任何元素,因此对数组进行简单的线性搜索就可以得到与您的条件相符的项目。
对数组排序最终会多次查看某些元素,这对于您的目的不是必需的。
如果你可以留出更多的内存,那么你可以扫描你的数组一次,得到匹配值的索引,并将其存储在另一个数组中。 这个新的数组将会显着缩短,因为它只有与特定模式匹配的值的索引! 像这样的东西
int original_array[SOME_SIZE]; int new_array[LESS_THAN_SOME__SIZE]; for ( int i=0,j=0; i<SOME_SIZE; i++) { if ( original_array[i]> LOWER_LIMIT && original_array[i]< HIGHER_LIMIT ) { new_array[j++] = i; } }
你需要做一次以上的形式,
for ( int i=0; i< LESS_THAN_SOME_SIZE; i++ ) { if ( original_array[new_array[i]]> LOWER_LIMIT && original_array[new_array[i]]< HIGHER_LIMIT ) { printf("Success! Found Value %dn",original_array[new_array[i]] ) } }
所以以一些内存为代价,可以节省相当多的时间。 即使您花费一些时间进行排序,您也必须每次解析排序后的数组。 这种方法最大限度地减少了数组的长度以及排序时间(当然是以额外的内存为代价))
试试这个库: http : //code.google.com/p/boolinq/
它是基于迭代器的,并且尽可能快,没有任何开销。 但是它需要C ++ 11标准。 Yor代码将以声明方式编写:
int arr[] = {1,2,3,4,5,6,7,8,9}; auto items = boolinq::from(arr).where([](int a){return a>3 && a<6;}); while (!items.empty()) { int item = items.front(); ... }
比基于迭代器的扫描更快,可以只有多线程扫描…
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。