Questions tagged «applied-theory»

理论结果和技术应用于实际环境。

4
为什么红黑树如此受欢迎?
在我看来,似乎到处都在使用红黑树(std::set在C ++,SortedDictionaryC#等中)实现数据结构。 在我的算法课程中刚刚覆盖了(a,b),红黑和AVL树之后,这就是我的收获(也是从问问教授,翻阅几本书并仔细研究一下)得出的: AVL树的平均深度小于红黑树,因此在AVL树中搜索值的速度始终更快。 与AVL树相比,红黑树进行结构调整以平衡自身的可能性要小一些,这可能会使它们的插入/删除速度更快。我可能会说,因为这将取决于对树的结构更改的成本,因为这将在很大程度上取决于运行时和隐含(当树是不可变的时,功能语言是否也可能完全不同?) 网上有很多基准可以比较AVL和红黑树,但令我惊讶的是,我的教授基本上说过,通常您会做以下两件事之一: 要么您根本就不在乎性能,在这种情况下,大多数情况下AVL与Red-black的10-20%的差异根本不重要。 或者,您真的很在乎性能,在这种情况下,您会抛弃AVL树和红黑树,并选择B树,可以对B树进行调整以使其工作得更好(或(a,b)树),我将所有这些都放在一个篮子里。) 这样做的原因是因为B树将数据更紧凑地存储在内存中(一个节点包含许多值),因此缓存未命中的情况将大大减少。您还可以根据用例来调整实现,并使B树的顺序取决于CPU缓存大小等。 问题在于,我几乎找不到任何可以分析现实硬件上不同实现的搜索树实际使用情况的资源。我浏览过许多有关算法的书,但没有发现可以将不同的树变体进行比较的任何东西,除了表明一棵树的平均深度比另一棵树小(这并没有真正说明树的行为方式)在实际程序中。) 话虽这么说,是否有一个特定的原因为什么到处都使用红黑树,而根据上述内容,B树应该胜过它们?(作为唯一的基准测试,我还可以看到http://lh3lh3.users.sourceforge.net/udb.shtml,但这可能只是具体实现的问题)。还是为什么每个人都使用Red-black树是因为它们很容易实现,或者换句话说,很难实现不好呢? 另外,当人们进入功能语言领域时,这将如何改变?似乎Clojure和Scala都使用Hash数组映射的trys,其中Clojure使用32的分支因子。

6
组,monoid和环在数据库计算中有什么用?
为什么像Twitter这样的公司会对诸如群,半体和环之类的代数概念感兴趣?在github:twitter / algebird上查看他们的存储库。 我所能找到的是: 有趣的近似算法(例如Bloom过滤器,HyperLogLog和CountMinSketch)的Monoid实现。这些使您可以像想数字一样思考这些复杂的操作,然后将它们加到hadoop或在线中以生成强大的统计信息和分析数据。 并在GitHub页面的另一部分中: 它最初是作为Scalding的Matrix API的一部分开发的,其中矩阵的值是Monoids,Groups或Rings的元素 。随后,很明显,该代码在Scalding和Twitter的其他项目中具有更广泛的应用。 这种更广泛的应用可能是什么?在Twitter上以及出于一般利益? 似乎数据库的组合聚合具有类单态结构。 关于Quora的相同问题:Twitter对抽象代数(与algebird一起)的兴趣是什么? 我有数学背景,但不是计算机科学家。拥有半身像和半群的“真实世界”使用将是很棒的。这些通常被认为是无用的理论构造,并且在许多抽象代数课程中都被忽略了(因为缺乏有趣的说法)。

9
上下文相关(类型1)语言的重要性是什么?
看到在乔姆斯基层次结构中,类型3语言可以由没有外部存储器的状态机(即有限自动机)识别,类型2由具有单个堆栈的状态机(即下推自动机)识别,类型0可以通过类型识别。一个具有两个堆栈的状态机(或者等效地,一个磁带,就像图灵机的情况一样),类型1的语言如何适合这张图片?而且,确定一种语言不仅是Type 0还是Type 1会带来什么优势?

8
成为一个不了解计算复杂性的程序员是否有问题?
我在大学里分配了一个练习。我把它带回家并尝试编写一种算法来解决它,我想这与图有关,可以找到连接的组件。 然后,我想到了最琐碎的事情,然后告诉我的讲师。经过简短的观察,他认为我的解决方案的运行时复杂性是不可行的,并显示出一些更有效的方法。而且有一种传统的程序员不知道什么是计算复杂性(我就是其中之一),所以如果程序员不知道什么是计算复杂性会存在问题吗?

2
SAT求解器的n分之一编码
我正在使用SAT解算器对问题进行编码,作为SAT实例的一部分,我具有布尔变量,其中这些变量中的一个应该为true,其余的应该为false 。(我有时将其描述为“一次性”编码。)X1个,X2,… ,xñx1,x2,…,xnx_1,x_2,\dots,x_n 我想在SAT中编码约束“一个必须为true”。编码此约束以使SAT求解器尽可能高效运行的最佳方法是什么?X1个,… ,xñx1,…,xnx_1,\dots,x_n 我可以看到许多方法来编码此约束: 成对约束。我可以为所有添加成对约束以确保至多一个为true,然后添加以确保至少一个为true 。我,Ĵ X 我X 1 ∨ X 2 ∨ ⋯ ∨ X Ѭ X一世∨ ¬ XĴ¬xi∨¬xj\neg x_i \lor \neg x_j我,Ĵi,ji,jX一世xix_iX1个∨ X2∨ ⋯ ∨ Xñx1∨x2∨⋯∨xnx_1 \lor x_2 \lor \cdots \lor x_n 这将添加子句,并且没有额外的布尔变量。Θ (n2)Θ(n2)\Theta(n^2) 二进制编码。 我可以引入新的布尔变量来表示(以二进制形式)一个整数,使得(添加一些布尔约束以确保在所需范围内)。然后,我可以添加一些约束来强制是tree,而所有其他都是false。换句话说,对于每个,我们添加强制执行子句。我1,我2,... ,我LG的Ñ我1 ≤ 我≤ Ñ 我X 我X Ĵ Ĵ 我= Ĵ …


3
基数排序的实际应用
当您知道键在某个有限范围内时,从根本上讲,基数排序非常快,例如,值在范围内。如果你只值转换为基础这需要时间,做了基础基数排序,然后再转换回原来的一个整体底座算法。[ 0 ... Ñ ķ - 1 ] ķ &lt; LG Ñ Ñ Θ (Ñ )ñ Θ (Ñ ķ )ñnn[ 0 … nķ− 1 ][0…nk−1][0\dots n^k -1]k &lt; lgñk&lt;lg⁡nk<\lg nñnnΘ (n )Θ(n)\Theta(n)ñnnΘ (千k )Θ(nk)\Theta(nk) 但是,我已经读到,实际上,基数排序通常比进行随机化的quicksort慢得多: 对于大型阵列,基数排序的指令数最少,但是由于其相对较差的缓存性能,其总体性能比合并排序和快速排序的内存优化版本差。 基数排序只是一种很好的理论算法,还是有通用的实际用途?

1
利用范畴理论框架的单子自然发生
今天,亨宁·科斯坦(Henning Kerstan)的演讲(“概率转移系统的轨迹语义”)使我第一次遇到了范畴论。他建立了一个理论框架,以一般方式描述概率过渡系统及其行为,即具有无穷无穷的状态集和不同的迹线概念。为此,他经历了几层抽象,最后得出了monad的概念,并将其与测度理论相结合来构建所需的模型。 最后,他花了45分钟时间(大致)构建了一个框架来描述他最初在5分钟内解释的概念。我欣赏这种方法的优点(它确实很好地概括了痕迹的不同概念),但仍然使我感到奇怪。 我很难理解一个monad到底是什么,以及一个概念在应用程序中(在理论上和实践上)多么有用。就结果而言,真的值得付出努力吗? 因此这个问题: 是否存在可以应用单子抽象概念的自然问题(就CS而言),并且可以帮助(甚至起到工具作用)获得期望的结果(完全或以比没有时更好的方式)?

1
实践中的通用哈希
如果 ,则哈希函数族是通用的 您可以在此Wikipedia 文章中找到有关通用哈希的更多信息。HHH^ h :ü→ { 0 ,… ,M− 1 }H:ü→{0,…,中号-1个}h: U \rightarrow \{0,\ldots,M-1\}∀ X , ÿ∈ ü,x ≠ y⇒ 镨ħ ∈ ħ[ h (x )= h ( y)] ≤ 1中号∀X,ÿ∈ü,X≠ÿ⇒镨H∈H[H(X)=H(ÿ)]≤1个中号\forall x,y \in U, x \neq y \Rightarrow \Pr_{h \in H}[h(x) = h(y)] \leq \frac{1}{M} 现在,通用哈希的概念已成为本科生数据结构课程的标准部分。能够激励学生认识通用哈希在工业应用中的重要性。所以我的问题是: 哈希函数通用族的构造在实践中重要吗?如果答案是肯定的,请您分享一些您所看到的有趣的工业应用程序吗?


5
类型理论的日常应用
我想了解类型理论,但是我首先必须知道如何应用它。除了在编程中使用类型系统之外,类型理论还会有更多非显而易见的应用吗?可以说其他应用程序,比如性格分析之类的吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.