在Java中声明大小为n的数组的运行时间是多少?我想这将取决于内存是否zero'ed出来的垃圾收集(在这种情况下,它可能是O(1)),或在初始化(在这种情况下,它不得不为O(N)).
在处理小项目时,您认为将数据存储在简单文本文件,哈希表等中的收支平衡点与使用真实数据库相比如何?对于具有简单数据管理要求的小型项目,真正的数据库是不必要的复杂性并且违反了YAGNI.但是,在某些时候,数据库的复杂性显然是值得的.有什么迹象表明你的问题对于简单的ad-hoc技术来说过于复杂并且需要真正的数据库?
注意:对于习惯于企业环境的人来说,这可能听起来像一个奇怪的问题.但是,我的问题领域是生物信息学.我的大多数编程都是原型,而不是生产代码.我主要是域专家,其次是程序员.我的大多数代码都是以算法为中心的,而不是以数据管理为中心的.这个问题的目的主要是让我弄清楚如果我学会在我的代码中使用正确的数据库而不是我通常使用的更多临时技术,我可以节省多少工作.
我正在编写一个简单的Python程序.
我的程序似乎受到字典线性访问的影响,即使算法是二次的,它的运行时间也呈指数级增长.
我使用字典来记忆值.这似乎是一个瓶颈.
我正在散列的值是点的元组.每个点是:(x,y),0 <= x,y <= 50
字典中的每个键是:2-5点的元组:((x1,y1),(x2,y2),(x3, Y3),(X4,Y4))
密钥的读取次数比写入次数多很多次.
我是否认为python dicts受到这些输入的线性访问时间的影响?
据我所知,集合保证了对数访问时间.
如何在Python中使用集合(或类似的东西)模拟dicts?
编辑根据请求,这是memoization函数的(简化)版本:
def memoize(fun):
memoized = {}
def memo(*args):
key = args
if not key in memoized:
memoized[key] = fun(*args)
return memoized[key]
return memo
Run Code Online (Sandbox Code Playgroud) 我正在从我的电子书中粘贴这个文本.它说O(n 2)的复杂性,并给出了解释,但我没有看到如何.
问题:此代码的运行时间是多少?
public String makeSentence(String[] words) {
StringBuffer sentence = new StringBuffer();
for (String w : words) sentence.append(w);
return sentence.toString();
}
Run Code Online (Sandbox Code Playgroud)
这本书的答案是:
O(n 2),其中n是句子中的字母数.原因如下:每次将一个字符串附加到句子上时,您创建一个句子副本并遍历句子中的所有字母以将其复制如果您必须在循环中每次迭代最多n个字符,并且您是循环至少n次,这给你一个O(n 2)运行时间.哎哟!
有人可以更清楚地解释这个答案吗?
Set,类似于[]具有完美定义的monadic操作.问题是它们要求值满足Ord约束,因此不可能定义return并且>>=没有任何约束.同样的问题适用于需要对可能值进行某种约束的许多其他数据结构.
标准技巧(在haskell-cafe帖子中向我建议)是包含Set在延续monad中.ContT并不关心底层类型仿函数是否有任何约束.只有在将Sets 包装/展开到continuation中时才需要约束:
import Control.Monad.Cont
import Data.Foldable (foldrM)
import Data.Set
setReturn :: a -> Set a
setReturn = singleton
setBind :: (Ord b) => Set a -> (a -> Set b) -> Set b
setBind set f = foldl' (\s -> union s . f) empty set
type SetM r a = ContT r Set a
fromSet :: (Ord r) => Set a …Run Code Online (Sandbox Code Playgroud) 对于最常见的数据结构(包括数组,链表,哈希表等)的操作,没有大O表示法的摘要.
我想知道是否有任何自动方法来确定(至少大致)给定函数的Big-O时间复杂度?
如果我绘制O(n)函数与O(n lg n)函数,我想我能够在视觉上确定哪个是哪个; 我认为必须有一些启发式解决方案,可以自动完成.
有任何想法吗?
编辑:我很高兴找到一个半自动化的解决方案,只是想知道是否有某种方法可以避免进行全手动分析.
我需要计算以下代码的时间复杂度:
for (i = 1; i <= n; i++)
{
for(j = 1; j <= i; j++)
{
// Some code
}
}
Run Code Online (Sandbox Code Playgroud)
是O(n ^ 2)?
所以,不久前我读了一个像这样的笑话:
"永远不要用二进制来计算pi - 因为它无限地进行并且是随机的,它理论上包含每个有限的位串.因此,你将拥有所有受版权保护的材料,并承担一些严重的罚款."
这显然是幽默的,但它让我思考.如果每个有限位串都存在于pi的二进制表示中,是否可以将其用作传输数据的方法?
例如,假设我想传输一个可以解释为jpeg图像的位字符串.我不是直接发送信息,而是在pi的数字内找到它的位置,并简单地发送pi数字中第一位的位置,以及字符串的长度.
这对我来说似乎很简单,但这里显而易见的问题是,即使是前几万亿个数字内找到这个字符串的概率也非常小.因此,最终可能需要花费大量时间才能找到.
我的想法是,几台机器可以专门用于在pi中搜索大文件,然后创建所有起始位置的索引.因此,每次计算只需要发生一次,然后从那时起可以非常快速地传输该信息.
所以你怎么看?这完全可行,还是这些计算需要花费太多时间?
谢谢阅读!如果我忽略了任何发布指南,我会道歉,如果我在这个论坛中提出第一个问题.
编辑:
感谢您的快速回复,伙计们!我认为我的推理有错误,很高兴知道为什么!
algorithm ×3
big-o ×3
java ×2
arrays ×1
curry-howard ×1
database ×1
dictionary ×1
hash ×1
haskell ×1
monads ×1
performance ×1
pi ×1
python ×1
stringbuffer ×1