javascript

java

python

c#

android

c++

node.js

php

reactjs

jquery

html

css

ios

.net

git

ruby-on-rails

sql

c

string

ruby

编程语言-“闭包”和“块”之间到底有什么区别?

我发现很多人都使用闭包和可互换的单词。 这些人大多数无法解释他们在说什么。

一些Java程序员(甚至是来自非常昂贵的咨询公司的Java程序员)都将匿名内部类称为“块”和“闭包”,但是我知道事实并非如此。 (您不能在定义它们的方法范围内传递可变变量...)

我在找:

  • 块的精确的计算机科学定义
  • 闭包的精确的计算机科学定义
  • 并澄清两者之间的区别。

我真的很想看看这些的链接,文章或书籍参考。

trans by 2020-07-09T11:58:26Z

计算机科学-什么是图灵机?

什么是图灵机?为什么人们不断提到它? 我的IBM PC是我进行计算所需的全部! 为什么有人在乎这些机器?

trans by 2020-07-05T15:39:57Z

计算机科学-评估语言的“转换完整性”的实用准则是什么?

我已经阅读了“ what-is-turing-complete”和wikipedia页面,但是我对正式的证明兴趣不如对Turing Complete的实际意义感兴趣。

我实际上试图确定的是,我刚刚设计的玩具语言是否可以用作通用语言。 我知道我可以证明是否可以用它编写图灵机。 但是在我相当确定成功之前,我不希望进行该练习。

是否有最少的功能集,否则没有图灵完整性是不可能的?是否有实际上可以保证完整性的一组功能?

(我的猜测是条件分支和可读/可写内存存储将带给我大部分帮助)


编辑:

我想我已经说“完成”了。 我试图以合理的信心猜测具有某些功能集的新发明的语言(或者具有特定指令集的VM)将能够计算出任何值得计算的东西。 我知道证明用它构建图灵机是一种方法,但不是唯一的方法。

我所希望的是一组准则,例如:“如果它可以执行X,Y和Z,那么它可能可以执行任何操作”。

trans by 2020-06-30T04:50:55Z

计算机科学-了解神经网络的反向传播

更新:更好地解决了这个问题。

我试图以XOR神经网络为例来了解反向传播算法。 在这种情况下,有2个输入神经元+ 1个偏差,隐藏层中2个神经元+ 1个偏差和1个输出神经元。

 A   B  A XOR B
 1    1   -1
 1   -1    1
-1    1    1
-1   -1   -1

A sample XOR neural network
(来源:wikimedia.org)

我正在使用随机反向传播。

阅读更多内容后,我发现输出单元的错误会传播到隐藏层...最初这很令人困惑,因为当您到达神经网络的输入层时,每个神经元都会进行错误调整 来自隐藏层中的两个神经元。 特别是,起初难以掌握错误的分布方式。

步骤1计算每个输入实例的输出。
第2步计算输出神经元(在我们的例子中只有一个)和目标值之间的误差:
Step 2
步骤3我们使用步骤2中的误差来计算每个隐藏单位h的误差:
Step 3

“权重kh”是隐藏单元h和输出单元k之间的权重,这很容易混淆,因为输入单元没有与输出单元关联的直接权重。 盯着公式看了几个小时后,我开始思考求和的含义,然后我得出的结论是,连接到隐藏层神经元的每个输入神经元的权重都乘以输出误差,然后求和 。 这是一个合乎逻辑的结论,但是该公式似乎有些混乱,因为它清楚地说明了“权重kh”(在输出层k和隐藏层h之间)。

我在这里正确理解所有内容吗? 有人可以确认吗?

输入层的O(h)是多少? 我的理解是,每个输入节点都有两个输出:一个进入隐藏层的第一个节点,另一个进入第二个节点隐藏层。 应将两个输出中的哪一个插入公式的O(h)*(1 - O(h))部分?
Step 3

trans by 2020-06-24T22:07:37Z

性能-O(log N)== O(1)-为什么不呢?

每当我考虑算法/数据结构时,我都倾向于用常量替换log(N)部分。 哦,我知道log(N)有所不同-但是在实际应用中这有关系吗?

log(infinity)<100,出于所有实际目的。

我真的对不存在这种情况的真实示例感到好奇。

澄清:

  • 我了解O(f(N))
  • 我对现实世界中的示例感到好奇,在这些示例中,渐近行为比实际表现的常量更重要。
  • 如果log(N)可以用常量替换,它仍然可以用O(N log N)中的常量替换。

这个问题是出于(a)娱乐和(b)收集我在(再次)遇到有关设计性能的争议时要使用的论点。

trans by 2020-06-17T18:45:07Z

C ++-二进制堆的有效实现

我正在寻找有关如何有效实现二进制堆的信息。 我觉得应该有一篇不错的文章关于有效地实现堆,但是我还没有找到。 实际上,除了诸如将堆存储在数组中之类的基础知识之外,我一直无法找到有效实施方面的任何资源。 我正在寻找用于制作快速二进制堆的技术,这些技术将超出我在下面描述的那些技术。

我已经编写了一个比Microsoft Visual C ++和GCC的std :: priority_queue更快的C ++实现,或者使用了std :: make_heap,std :: push_heap和std :: pop_heap。 以下是实现中已经介绍的技术。 我只是想出最后2个,尽管我怀疑这些是新主意:

(编辑:添加了有关内存优化的部分)

  • 起始索引为1
    查看Wikipedia实施说明中的二进制堆。 如果堆的根位于索引0,则索引为n的节点的父代,左子代和右子代的公式分别为(n-1)/ 2、2n + 1和2n + 2。 如果使用基于1的数组,则公式将变得更简单n / 2、2n和2n +1。因此,使用基于1的数组时,父级和左子级的效率更高。 如果p指向基于0的数组,并且q = p-1,那么我们可以将p [0]作为q [1]进行访问,因此使用基于1的数组不会有开销。

  • 在用叶替换之前,先将弹出/移除元素移动到堆的底部
    经常通过将最上面的元素替换为最左边的底部叶子,然后将其向下移动直到恢复堆属性来描述在堆上弹出。 这需要对我们经过的每个级别进行2个比较,并且由于将叶子移到了堆的顶部,所以我们有可能沿着堆向下移动。 因此,我们应该期望少于2个log n比较。

    相反,我们可以在顶部元素所在的堆中留下一个孔。 然后,通过迭代将较大的子对象向上移动,从而将那个孔向下移动到堆中。 这只需要我们经过的每个级别1个比较。 这样,孔将变成叶子。 在这一点上,我们可以将最右边的底部叶子移到孔的位置,并将该值向上移动,直到恢复heap属性。 由于我们移动的值是一片叶子,因此我们不希望它向树的上方移动。 因此,我们应该期待的比log n比较多,这比以前要好。

  • 支持更换顶
    假设您要删除max元素并插入一个新元素。 然后,您可以执行上述任何一种删除/弹出式实施方式,但是可以使用希望插入/推送的新值来代替移动最右边的底部叶子。 (当大多数操作都是这种操作时,我发现锦标赛树比堆好,但是在其他情况下堆会更好。)

  • 使sizeof(T)为2的幂
    父公式,左子公式和右子公式对索引起作用,并且不能使它们直接对指针值起作用。 因此,我们将使用索引,这意味着从索引i查找数组p中的值p [i]。 如果p是T *并且i是整数,则

    parentOnJ(j) = parent(j/sizeof(T))*sizeof(T) == (j/(2*sizeof(T))*sizeof(T)
    

    并且编译器必须执行此计算以获得p [i]。 sizeof(T)是一个编译时常数,如果sizeof(T)是2的幂,则乘法可以更有效地完成。 通过增加8个填充字节将sizeof(T)从24增加到32,我的实现变得更快。降低缓存的效率可能意味着这对于足够大的数据集不是一个胜利。

  • 预乘索引
    我的数据集性能提高了23%。 除了找到父项,左子项和右子项之外,我们对索引所做的唯一一件事就是在数组中查找索引。 因此,如果我们跟踪j = sizeof(T)* i而不是索引i,那么我们可以进行查找p [i]而无需乘法,否则乘法在评估p [i]时是隐含的

    parentOnJ(j) = parent(j/sizeof(T))*sizeof(T) == (j/(2*sizeof(T))*sizeof(T)
    

    然后,j值的左子公式和右子公式分别变为2 * j和2 * j + sizeof(T)。 父公式有点棘手,除了将j值转换为i值然后像这样返回之外,我没有找到其他方法:

    parentOnJ(j) = parent(j/sizeof(T))*sizeof(T) == (j/(2*sizeof(T))*sizeof(T)
    

    如果sizeof(T)是2的幂,则将编译为2个移位。 这比使用索引i的常规父级多1个操作。 但是,我们随后在查询中保存了1个操作。 因此,最终的结果是,以这种方式查找父对象花费的时间相同,而左子对象和右子对象的查找变得更快。

  • 内存优化

    TokenMacGuy和templatetypedef的答案指出了基于内存的优化,可以减少缓存丢失。 对于非常大的数据集或不经常使用的优先级队列,操作系统可以将队列的一部分换出到磁盘上。 在那种情况下,增加大量开销以最佳利用缓存是值得的,因为从磁盘进行交换非常慢。 我的数据很容易放入内存并可以连续使用,因此队列的任何部分都不会交换到磁盘上。 我怀疑大多数优先级队列都是这种情况。

    还有其他优先级队列,旨在更好地利用CPU缓存。 例如,一个4堆应该有较少的高速缓存未命中,并且额外的开销不是很多。 LaMarca和Ladner在1996年的报告中指出,通过对齐4堆,他们的性能提高了75%。 但是,亨德里克斯在2010年的报告中指出:

    还测试了LaMarca和Ladner [17]提出的对隐式堆的改进,以改善数据局部性并减少缓存丢失。 我们实现了四路堆,对于非常偏斜的输入数据,它确实显示出比两路堆更好的一致性,但是仅对于非常大的队列大小而言。 较大的队列大小可以通过分层堆更好地处理。


  • 是否有比这些更多的技术?

  • trans by 2020-01-30T09:36:00Z

    算法-证明随机生成的数是均匀分布的

    采访中有人问我这个问题。

    给定一个随机数生成器以生成一个[0,AND)之间的数字,如何证明该数字是均匀分布的。

    我不确定如何解决这个问题,有什么建议吗?

    trans by 2020-01-22T08:32:37Z

    计算机科学-暂停问题到底是什么?

    每当有人问起与编程有关的暂停问题时,人们都会回答“如果只添加一个循环,就已经有了暂停程序,因此无法自动执行任务”

    说得通。 如果您的程序有无限循环,那么在您的程序运行时,您将无法知道程序是否仍在处理输入,或者是否只是在无限循环。

    但这似乎有些违反直觉。 如果我正在编写一个暂停问题解决程序,它将源代码作为输入,该怎么办。 c

    如果我的代码(source.c)如下所示:

    for (;;) {  /* infinite loop */  }
    

    看来我的程序很容易看到这一点。 “看看循环,看看条件。如果条件只是基于文字,没有变量,那么您总是知道循环的结果。如果有变量(例如,当(x <10)时),请查看是否 这些变量曾经被修改过。如果没有修改,那么您总是知道循环的结果。”

    当然,这些检查并非微不足道(计算指针算术等),但似乎并非不可能。 例如:

    int x = 0
    while (x < 10) {}
    

    可以被检测到。 与-尽管不是很简单:

    int x = 0
    while (x < 10)
    {
       x++;
       if (x == 10)
       {
          x = 0
       }
    }
    

    现在用户输入呢? 那就是踢腿,这就是使程序无法预测的原因。

    int x = 0;
    while (x < 10) 
    {
       scanf("%d", &x); /* ignoring infinite scanf loop oddities */
    }
    

    现在我的程序可以说:“如果用户输入10或更大,该程序将停止。在所有其他输入上,它将再次循环。”

    这意味着,即使有数百个输入,也应该能够列出程序将停止的条件。 确实,当我编写程序时,我总是确保有人能够终止该程序! 我并不是说要创建的条件列表很琐碎,但对我来说似乎并非不可能。 您可以从用户那里获取输入,使用它们来计算指针索引,等等-但这只是增加了一定数量的条件以确保程序将终止,这不会导致无法枚举它们。

    那么停顿问题到底是什么呢? 关于我们无法编写问题来检测无限循环的想法,我不了解吗? 或者,为什么“循环”经常被引用?

    更新

    因此,让我稍微改变一下这个问题:什么是暂停问题,因为它适用于计算机? 然后,我将回应一些评论:

    许多人说,该程序必须能够处理“任何任意输入”。 但是在计算机中,从来没有任何输入。 如果我只输入一个字节的数据,那么我只有2 ^ 8个可能的输入。 因此,例如:

    int c = getchar()
    
    switch (c) {
       case 'q':
          /* quit the program */
    }
    

    突然之间,我刚刚考虑了所有可能性。 如果c具有位模式0x71,则它会做一件事。 对于所有其他模式,它还会执行其他操作。 即使是接受任意字符串输入的程序也从来都不是真正的“任意”程序,因为资源是有限的,这意味着,尽管“任意”理论适用,但实际上并非一对一。

    人们引用的另一个示例是:

    while (n != 1)
        if (n & 1 == 1) 
            n = 3 * n + 1;
        else 
            n /= 2;
    

    如果n是一个32位整数...那么我可以直观地告诉您这是否将停止。

    我猜这个编辑没有要求任何东西,但是我看到的最令人信服的例子是这个:

    假设您拥有神奇的程序/方法来确定程序停止了。

    public bool DeterminesHalt(string filename, string[] args){
        //runs whatever program you tell it do, passing any args
        //returns true if the program halts, false if it doesn't
    }
    

    现在假设我们编写了一小段代码,例如...

    public static void Main(string[] args){
        string filename = Console.ReadLine(); //read in file to run from user
        if(DeterminesHalt(filename, args))
            for(;;);
        else
            return;
    }
    

    因此,对于此示例,我们可以编写一个程序来执行与魔术暂停方法完全相反的操作。 如果我们以某种方式确定给定的程序将停止,我们将跳入无限循环; 否则,如果我们确定程序处于无限循环中,则结束程序。

    再说一次,如果您有意编写一个包含无限循环的程序……“解决停顿问题”是有争议的,不是吗?

    trans by 2020-01-10T22:30:27Z

    计算机科学-图灵机与冯·诺依曼机

    背景

    冯·诺依曼(Von-Neumann)体系结构描述了一种存储程序计算机,其中指令和数据存储在内存中,并且机器通过更改其内部状态进行工作,即一条指令对某些数据进行操作并修改数据。 因此,固有地,系统中维护着状态。

    图灵机体系结构通过操纵磁带上的符号来工作。 即存在具有无限数量的插槽的磁带,并且在任何时间点,图灵机都位于特定的插槽中。 根据在该插槽读取的符号,机器可以更改符号并移至其他插槽。 所有这些都是确定性的。


    问题

    1. 这两个模型之间有什么关系吗? 冯·诺依曼模型是基于图灵模型还是受其启发?

    2. 我们可以说图灵模型是冯·诺依曼模型的超集吗?

    3. 函数式编程是否适合图灵模型? 如果是这样,怎么办? 我假设函数式编程不太适合Von Neuman模型。

    trans by 2019-11-03T06:01:30Z

    信息论-熵的计算机科学定义是什么?

    我最近在我的大学开始了一个数据压缩课程。 但是,我发现术语“熵”在计算机科学中的应用相当模糊。 据我所知,它大致可以解释为系统或结构的“随机性”。

    计算机科学“熵”的正确定义是什么?

    trans by 2019-10-06T17:51:14Z

    算法-检测树结构之间的差异

    这更多是一个CS问题,但有趣的是:

    假设我们有2个树结构,它们或多或少地重组了相同的节点。 你怎么会找到

    1. 任何
    2. 在某种意义上说极小

    操作顺序

    • DELETE (A)-将节点A移动到节点B下(带有整个子树)
    • DELETE (A)-在节点B下插入新节点N
    • DELETE (A)-删除节点A(具有整个子树)

    将一棵树转化为另一棵树。

    显然,在某些情况下,这种转换是不可能的,琐碎的是将根A与子B转换为根B与子A等)。 在这种情况下,该算法将简单地传递“不可能”的结果。

    对于网络来说,更通用的版本是通用的,即当我们假设一个节点可以在树中出现多次(有效地具有多个“父级”)时,则禁止循环。

    免责声明:这不是家庭作业,实际上是来自一个实际的业务问题,我想知道是否有人知道解决方案非常有趣。

    trans by 2019-09-26T17:06:18Z

    数学-知道lambda演算有多大用处?

    对所有了解lambda演算的人:在编程方面,它给您带来了什么好处? 您会建议人们学习它吗?

    trans by 2019-09-24T20:17:29Z

    c - 函数指针,闭包和Lambda

    我刚才正在学习函数指针,当我正在阅读关于这个主题的K&R章节时,第一件让我感到惊讶的是,“嘿,这有点像一个闭包。” 我知道这种假设在某种程度上是根本错误的,在网上搜索后我没有找到任何对这种比较的分析。

    那么为什么C风格的函数指针与闭包或lambdas根本不同呢? 据我所知,它与函数指针仍然指向已定义(命名)函数的事实有关,这与匿名定义函数的做法相反。

    为什么将函数传递给在第二种情况下看起来更强大的函数,它是未命名的,而不是第一种传递的正常日常函数?

    请告诉我如何以及为什么我错误地比较这两者。

    谢谢。

    trans by 2019-09-16T03:39:17Z

    mysql - B-Tree vs Hash Tab

    在MySQL中,索引类型是b树,并且访问b树中的元素是以对数分摊的时间O(1)

    另一方面,访问哈希表中的元素是在O(1)中。

    为什么不使用哈希表而不是b树来访问数据库中的数据?

    trans by 2019-09-16T02:32:49Z

    我应该知道什么是计算机科学概念?

    您认为计算机科学中的哪些概念使您成为更好的程序员?

    我的学位是机械工程,因此最终成为程序员,我有点缺乏基础知识。 我最近学到的一些标准CS概念使我对我正在做的事情有了更深刻的理解,具体来说:

    语言特色

    • 指针&amp; 递归(谢谢乔尔!)

    数据结构

    • 链接列表
    • 散列表

    算法

    • 泡泡排序

    显然,目前这个名单有点短,所以我希望得到以下建议:

    1. 我应该理解什么概念,
    2. 正确理解它们的任何好资源(因为维基百科有时可能有点密集和学术)。
    trans by 2019-08-28T17:08:31Z

    计算机科学 - 定点与浮点数

    由于难以在Google上阅读有关它们的定义,我无法理解定点和浮点数。 但是我读过的没有提供一个简单的解释,说明它们到底是什么。 我能用例子得到一个简单的定义吗?

    trans by 2019-08-25T22:15:18Z

    语言无关 - 什么是Lambda?

    有人可以提供一个很好的描述Lambda是什么? 我们有一个标签,他们就是C#问题的秘密,但我还没有找到一个好的定义和解释它们是什么。

    trans by 2019-08-25T05:28:01Z

    计算机科学 - 什么是SSTable?

    在BigTable / GFS和Cassandra术语中,SSTable的定义是什么?

    trans by 2019-08-23T10:47:15Z

    语言不可知 - 哈希代码和校验和 - 有什么区别?

    我的理解是哈希码和校验和是类似的东西 - 为数据块计算的数值,它是相对独特的。

    即,产生相同数字散列/校验和值的两个数据块的概率足够低,以便为了应用的目的可以忽略它。

    那么我们是否有两个相同的词,或者哈希码和校验和之间有重要的区别?

    trans by 2019-07-31T07:39:09Z

    nosql - 简单英语的最终一致性

    我经常听到有关NoSQL,数据网格等不同演讲的最终一致性。似乎最终一致性的定义在许多来源中有所不同(甚至可能取决于具体的数据存储)。

    任何人都可以简单解释一般情况下的最终一致性,与任何具体的数据存储无关吗?

    trans by 2019-07-30T12:42:25Z

    1 2 3 下一页 共3页