当我需要一些复杂的算法时,我首先检查互联网上是否已发布任何相关内容.十分之十,我会发现有人已经找到了比我想象的更聪明的解决方案.
除了通用的Google搜索,我使用:
我还发现了J.UCS(通用计算机科学杂志)包含一些有趣的文章(但我没有真正使用过我在那里发现的任何信息).
你知道其他任何可以免费搜索和阅读好CS文章的地方吗?
从语法中生成句子的常用方法是什么?
我想要一种与解析器相反的算法.也就是说,给定一个正式的无上下文语法(比如LL),我想生成一个符合该语法的任意句子.我在这里使用句子来表示任何有效的文本体,因此它实际上可以是一个完整的程序(即使它没有任何意义 - 只要它的语法正确).
示例语法:
program : <imports> NEWLINE? <namespace>
imports : ("import" <identifier> NEWLINE)*
namespace : "namespace " <identifier> NEWLINE "{" <classes> "}"
identifier: (A-Za-z_) (A-Za-z0-9_)*
...
Run Code Online (Sandbox Code Playgroud)
生成的程序示例:
import jkhbhhuob
import aaaaa888_
namespace u8nFGubgykb
{ class ui0op_np { ... }
}
Run Code Online (Sandbox Code Playgroud) 我最近问了一个关于Dijkstra算法之一的问题(shunting-yard).但几乎所有人都认为"Dijkstra算法"意味着他的最短路径算法.
Dijkstra开发了哪些其他算法?
从纯计算机科学(或计算语言学)的角度来看,我想知道这些词之间的区别:
各种语言以不同的方式使用这些单词和功能.在Python中,例如,Decorators [根据Python Wiki](强调我的):
装饰器动态地改变函数,方法或类的功能,而不必直接使用子类或更改正在装饰的函数的源代码.
这让我感觉非常类似于面向方面的编程工具,如PostSharp或DynamicProxy.即:
[Profile]
private static void SleepSync()
{
Thread.Sleep(200);
}
Run Code Online (Sandbox Code Playgroud)
来源:PostSharp示例
在C#和Java(以及无数其他语言)中,属性可以表示Decorator-ish模式(C#)或字段(Java).
在C++中通过boost或PhP通过内置特征词,我们可以使用特征来扩展类,如下所示:https://en.wikipedia.org/wiki/Trait_ (computer_programming)
因此,从"纯粹"的角度来看,所有这些实际上是什么的规范定义是什么?有没有更好的方法来定义它们?
更具体地说,在编程中,当我们指的是另一段代码运行所需的软件组件时,我们使用术语“依赖” 。
您将需要依赖项才能运行的那段代码称为什么?我想我不知道这个词从相反的角度代表了这种关系。
我多年来一直担任顾问编程,我喜欢我的工作,涉及大量面向对象的分析和使用托管语言(即软件工程)的软件系统设计.但是我最终想获得一个博士学位,让我感到困扰的是我从未真正"获得"计算机科学理论.在大学里,我在这些课程中只做得很好,因为他们的教学方式并不适合我.我通过观察概念的应用来学习,而不是死记硬背.
我之前已经克服了这样一个障碍的一个例子 - 我有一个可怕的第一年.这位教授(我现在知道他几乎没有资格,也是一位不称职的老师)从C++开始,教我们程序编程.从技术上讲,我已经了解了一个对象是什么,但直到我看到面向对象分析和设计的应用(具有设计模式和其他结构,如链表),我才真正理解它们的用途.
我将如何学习编译器,编程语言理论和算法分析等学科?什么是开始这些的好方法?例如,我想最终编写一个编译器(为了好玩),但我不知道从哪里开始.有没有人遇到过这种情况?有关教程,免费在线讲座视频或参考的建议(像w3schools那样的东西会很棒)?
(我想补充一点,浏览Stackoverflow已经教会了我的负载,但我希望它有点更正式:)
编辑:谢谢大家的建议.我已经标记了一个对我个人有用的答案,但请保持答案:)
让我们说我采取的计算只涉及加法和乘法:
(a+b)*(c+d)
Run Code Online (Sandbox Code Playgroud)
这可以通过许多其他方式完成,例如.
a*(c+d) + b*(c+d)
a*c + a*d + b*c + b*d
Run Code Online (Sandbox Code Playgroud)
在加法和乘法方面,所示三个例子中每一个所需的操作数分别为(2,1)(3,2)(3,4).显然,如果目标是减少操作的总数,那么第一个是优越的.有没有办法,给定一个任意表达式来查找需要最少操作次数的计算顺序?
注意: 这个问题正在从SE.math重新询问CS人群的见解和观点.
具体来说:给定哈希(或数组索引),机器如何在恒定时间内获取数据?
在我看来,即使通过所有其他存储器位置(或其他),也需要花费相当于传递的位置数量的时间量(因此线性时间).一位同事曾勇敢地向我解释这一点,但在我们开始接触电路时不得不放弃.
例:
my_array = new array(:size => 20)
my_array[20] = "foo"
my_array[20] # "foo"
Run Code Online (Sandbox Code Playgroud)
在位置20访问"foo"是不变的,因为我们知道哪个桶"foo"在.我们是如何神奇地到达那个桶而不通过所有其他的途中?要到达一个街区#20的房子,你仍然需要通过其他19 ...
使用传统的状态机定义,状态机记录可以同时处于多个状态吗?例如,如果我有一个User模型,用户可以同时subscriber处于a promotional_period状态和状态吗?
注意,我不是在问这样做是否有意义,我的问题是 - 是否可以使用状态机.
在我们关于安全性的第一次CS讲座中,我们讨论了C的问题,没有检查所谓的缓冲区长度以及可以利用此漏洞的不同方式的一些示例.
在这种情况下,它看起来像是恶意读取操作的情况,其中应用程序只读出了很多字节的内存
我是否正确断言Heartbleed错误是C缓冲区长度检查问题的表现?
为什么恶意使用在尝试读取其他应用程序的内存时不会导致分段错误?
在写入内存之前简单地将内存归零(然后随后从中读取)会导致分段错误吗?或者这在操作系统之间有所不同吗?或者其他一些环境因素?
显然无法识别漏洞的利用.是因为心跳功能在调用时不记录?否则对~64k字符串的任何请求肯定是恶意的?
computer-science ×10
algorithm ×2
terminology ×2
theory ×2
arrays ×1
aspect ×1
c ×1
decorator ×1
dependencies ×1
dijkstra ×1
grammar ×1
hash ×1
parsing ×1
security ×1
traits ×1