如何有效地找到数组中每个元素的排名,在平局的情况下求平均值?例如:
float[] rank(T)(T[] input) {
// Implementation
}
auto foo = rank([3,6,4,2,2]); // foo == [3, 5, 4, 1.5, 1.5]
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是分配 3 个数组:
有谁知道如何在 O(N log N) 时间和 O(1) 辅助空间中执行此操作(意味着我们必须分配的唯一数组是我们要返回的数组),或者至少摆脱其中之一上面的三个数组?
对于不是理论计算机科学家的人来说,学习像Haskell或Erlang这样的纯函数语言而不是具有强大功能组件的"不纯"语言(如Python或D编程语言的第2版)有什么优势?我的论点如下:
编辑:通过"不纯"的函数式语言,我真正的意思是具有功能性的强多语言语言,而不是具有一些非功能性能力的强功能语言.
我已经开发出对函数中长参数列表的自然厌恶.虽然这在某种程度上是一件好事,但有时长参数列表与代码重复或由于"手动内联"而导致的冗长功能相比,是两个邪恶中的较小者.什么是至少使这些怪物具有人类可读性的好方法?例如:
SomeClass[string] someFunction(SomeClass!(TemplateParam) foo,
string[][string] someAA, uint[] dataToProcess, SomeEnumType flag) {
// Do stuff.
}
Run Code Online (Sandbox Code Playgroud)
这在可读性等级上得分不高,但在很多情况下,四个参数非常合理.
我越是用不使用Python的语言浏览代码来开源项目,我越觉得似乎很多程序员都不相信正确的缩进.(我不会特别提到任何项目,以避免让任何人过于亲自接受这个问题.)通常代码是缩进的,但在某种程度上与标准风格不同,它让我发疯,特别是在旧/狡猾的代码中.我注意到,当我用类似C语言编写时,我倾向于正确地缩进,就像我在用Python编写时一样,除了调试代码,我实际上想要像拇指一样伸出来.鉴于使用现代IDE来修复不正确的缩进是多么容易,有什么理由可以让宗教上的缩进与大括号保持同步?
有人可以确认或更正这个维基百科算法来计算第一个主要组件吗?我想在D中简单实现PCA,它没有任何现有的PCA AFAIK库.我已经尝试过实现这一点了,似乎我的简单示例中的结果与从R或Octave得到的东西相匹配.我很确定这不是一个实现错误,因为我已经多次检查了我的实现,甚至从头开始重写它,这是一个非常简单的算法.
当程序访问文件,使用system()等时,该程序的当前工作目录的物理知识/存储方式和位置是什么?从逻辑上讲,程序的工作目录类似于全局变量,理想情况下它应该是线程本地的,特别是在像D这样的语言中,默认情况下"全局"变量是线程局部的.是否可以使程序的当前工作目录成为本地线程?
注意:如果您不熟悉D,即使是与语言无关的答案也会有用.
我试图理解D语言运行时中的一些代码.对于以下两件事似乎有单独的功能:
array1[] += scalar * array2[];
array1[] += array2[] * scalar;
Run Code Online (Sandbox Code Playgroud)
为什么不能用一个功能来完成这些?我认为即使在不精确的浮点运算中,乘法也是可交换的.
GPGPU是否已准备好用于生产和原型设计,或者您仍然认为它主要是研究/前沿技术?我在计算生物学领域工作,它开始吸引更多来自计算机科学的人在该领域的注意力,但大多数工作似乎是移植众所周知的算法.算法的移植本身就是研究项目,并且该领域的绝大多数人对此并不了解.
我在传统的多核上做了一些非常计算密集的项目.我想知道GPGPU有多接近可用于原型化新算法以及日常生产用途.从阅读维基百科,我得到的印象是编程模型很奇怪(严重SIMD)并且有些限制(没有递归或虚函数,虽然这些限制正在慢慢被删除;没有比C更高级的语言或C++的有限子集),而且有几个相互竞争的,不相容的标准.我也得到的印象是,与常规多核不同,细粒度并行性是城里唯一的游戏.需要重写基本库函数.与传统的多核不同,只需并行化程序的外循环并调用旧式串行库函数,就无法获得巨大的加速.
这些限制在实践中有多严重?GPGPU现在准备好用了吗?如果没有,你会猜多久?
编辑:我试图解决的一个主要问题是,编程模型与常规多核CPU有多少不同,后者具有大量非常慢的内核.
编辑#2:我想我总结我得到的答案的方式是GPGPU足够实用,适合早期采用者,它非常适合,但仍然不足以被视为"标准"工具,如多核或分布式并行,即使在性能很重要的那些利基中也是如此.
我有一个Python项目,其中性能非常重要.老实说,我知道Python(至少是纯Python)不是最好的工具,但无论如何我都在使用它,因为我想分发一些非常简单的纯python版本的一些研究代码,以便人们可以修改它,等,而不必设置复杂的环境.(我还有一个替代实现,用D编写,速度更快但更难破解.)
我使用PyPy作为我的翻译,并向任何使用此代码的人推荐它.这给了我合理的速度.然后我决定调整算法并需要从SciPy访问一些函数(我需要的只是CDF,生存函数和卡方阵的逆CDF).我尝试在CPython中运行我的代码来访问SciPy,它作为糖蜜很慢.
有人可以建议三件事之一:
一个kludge,允许我使用PyPy的一些片段SciPy.
在自由主义许可下,我需要更纯粹的python实现卡方分布功能吗?
一种JIT CPython瓶颈的方法?我知道Psyco,但它似乎没有维护,只适用于32位系统.
在哪里可以获得__merge_without_buffer()C++ STL中使用的算法的高级描述?我正在尝试使用D编程语言重新实现此代码,并进行一些增强.我似乎无法通过阅读STL源代码来理解它在算法级别所做的事情,因为太多的低级细节会掩盖它.此外,我不想盲目地翻译代码,因为那样,如果它不起作用我不知道为什么,我将无法添加我的增强功能.
algorithm ×3
d ×3
performance ×3
statistics ×3
coding-style ×2
readability ×2
sorting ×2
arrays ×1
c++ ×1
cuda ×1
filesystems ×1
gpgpu ×1
indentation ×1
libraries ×1
pca ×1
pypy ×1
python ×1
stl ×1
thread-local ×1
wikipedia ×1