通过"理论计算机科学主题",我指的是诸如常规语言和非常规语言,抽取引理和语法之类的东西.
我熟悉有限自动机和正则表达式的实际应用,但是这些其他主题给我带来了更多问题,因为我没有看到任何真实世界的应用程序.
我即将(与其他程序员一起)在我的高中开始编程和算法俱乐部.选择的语言是C++ - 抱歉,我无法改变这一点.我们可以假设学生对上述主题几乎没有经验.
您认为我应该关注的最基本概念是什么?
我知道教授对我来说已经很明显的东西并不是一件容易的事.我意识到第一次会议应该得到极大的关注 - 不要吓跑学生 - 所以我问你.
编辑:我注意到程序员和初学者之间的主要区别可能是"程序员的思维方式" - 我的意思是,将问题概念化为算法.我知道这只是一个练习问题,但你知道任何可以刺激这个领域发展的练习/概念/事物吗?
我正在寻找一种如此未知但有用的算法或数据结构,您认为这是计算机科学或编程社区的可怕疏忽.如果只有我们都可以学习这样一两件事,有很多好会做很多未来的计划.
我能想出的最好的是插值搜索,只有极少数程序员知道,而每个人都知道二进制搜索.我认为毫无疑问,快速搜索有序列表是一种非常有用且基本的算法.
这两者几乎完全相同 - 所以这不是问题.
它对均匀分布的数据执行O(log(log(n))),而不是二进制搜索O(log(n)).这意味着搜索40亿个数字只需要5个探测器而不是32个,那就更好了!
在非完美统一的数据上,它在大多数情况下仍然表现得非常好.只有当数据真正偏离时才会像二进制搜索一样糟糕或者更糟糕.当数据高度偏斜时,这是O(n)最坏的情况,但在大多数现实情况下这种情况非常罕见.
即便如此,人们也可以构造一个偶数/奇数算法来在两者之间交替,并得到最差的二分搜索情况,并使用插值搜索的平均情况来缓解极端情况.
大多数程序员/图书馆都忽略了这一点.
谁能打败那个人?
在关于D的Tech-Talk中的时间0:43:15,讨论了min函数的实现.在一些算法中使用时,关于"稳定性"和"额外改组(如果值相等)"的关注被提出作为所示实现的原因之一.
任何人都可以提供真实/实际用例(或提供更详细的解释),其中min的这个特定实现是"稳定的"(又名更好),而不是其他可能的实现?或者这只是alpha-geeks走得太远的另一个例子?
推荐实施:
template <class LHS, class RHS, class Return>
inline Return min(LHS& lhs, RHS& rhs)
{
return (rhs < lhs) ? rhs : lhs;
}
Run Code Online (Sandbox Code Playgroud)
其他可能的实施:
template <class LHS, class RHS, class Return>
inline Return min(LHS& lhs, RHS& rhs)
{
return (lhs < rhs) ? lhs: rhs;
}
Run Code Online (Sandbox Code Playgroud)
提案N2199提供基于后者的实现,请注意该提案目前尚未成功.
这是这个问题的描述:
你有两个整数a和b.您希望找到将a转换为b所需的最短操作序列,其中每个步骤允许您添加或减去5,7或12.
例如,如果给出a = -5且b = 19,则最短路径为
-5 + 12 + 12 = 19
Run Code Online (Sandbox Code Playgroud)
如果给你1和3,那么最短的路径就是
1 + 7 - 5 = 2
Run Code Online (Sandbox Code Playgroud)
我可以考虑解决这个问题的唯一方法是使用BFS,也许还有一些修剪.我可以使用更好的算法吗?
谢谢!
我真的在努力理解这两者之间的区别.从我的教科书中,它实质上描述了差异
如果语言是图灵可识别语言的补充,那么这种语言就是可识别的.
我想这个定义我不理解的部分是:当它是图灵识别语言的补充时它意味着什么?
你究竟如何确定它是否是另一种语言的补充?
场景:
存在用户拥有的电影数据库,电影显示在称为"我的电影"的页面上,电影可以按照用户期望的顺序显示.例如位置#1中的"搏击俱乐部",位置#3中的"驱动器",依此类推.
显而易见的解决方案是为每个项目存储一个位置,例如:
movieid,userid,position
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
然后在输出数据时按位置排序.此方法适用于输出,但在更新时存在问题:项目的位置需要更新所有其他位置,因为位置是相对的.如果电影#3现在位于第2位,则电影#3现在需要更新到位置#2.如果数据库包含10,000部电影,并且电影从位置#1移动到位置#9999,则需要更新近10,000行!
我唯一的解决方案是单独存储定位,而不是每个项目位置都有一个单独的字段,它只是一个大的数据转储位置,在运行时采取并与每个项目相关联(json,xml,无论如何),但感觉..效率低下因为数据库无法进行排序.
我总结的问题:在一个对提取和更新友好的列表中存储项目位置的最有效方法是什么?
行为被普遍定义为"时变值" 1.
为什么?时间是变化值的依赖/参数非常罕见.
我对FRP的直觉是将行为改为事件变化值; 它更常见,更简单,我发布了更多有效的想法,并且可扩展到足以支持时间(tick事件).
例如,如果你编写一个计数器,你不关心时间/相关的时间戳,你只关心"点击增加按钮"和"减少按钮点击"事件.
如果你写一个游戏并想要一个位置/力量行为,你只关心WASD /箭头键举行的事件等(除非你禁止你的球员在下午向左移动;多么不公平!).
所以:为什么时间是一个考虑因素?为什么时间戳?为什么一些库(例如reactive-banana,reactive)把它上升到具有的程度Future,Moment值?为什么使用事件流而不是仅响应事件发生?所有这一切似乎都过于复杂化了一个简单的想法(事件变化/事件驱动值); 有什么好处?我们在这里解决了什么问题?(如果可能的话,我也希望得到一个具体的例子和一个精彩的解释).
theory haskell functional-programming frp reactive-programming
我一直在阅读很多关于保证分布式系统中节点之间一致性的不同策略,但是我在确定何时使用哪种算法时遇到了一些麻烦.
使用什么样的系统我会使用像矢量时钟这样的东西?哪个系统适合使用像Paxos这样的东西?两者是相互排斥的吗?