客观回应:
虽然我最初对这个问题的回答是基于我作为一名即将毕业的CS学生的经验,以及我对我想与CS领域一起工作的人的类型的预期观点。实际上有一个客观的答案(关于ACM SIGCSE和IEEE计算协会的主观意见)。ACM与IEEE机构每10年合作发表一份联合出版物,其中详细介绍了基于计算机行业状况的专业知识为本科计算机科学课程提供的建议。有关更多信息,请访问cs2013.org。该委员会发布了一份最终报告,列出了他们的课程建议。
话虽如此,我仍然认为我的名单还不错。
以下是原始答案。
我应该知道些什么?
最低要求
我认为熟练的程序员至少应具有计算机科学的本科知识。当然,由于CS座落于坚如磐石的社区中,而且大多数专业职位的工作范围缩小,因此仅使用一小部分计算机科学就可以在许多工作中发挥作用。同样,许多人将在大学学习后进一步专注于专业。但是,我也不认为没有基础的CS知识也不是借口。
为了回答标题问题,以下是本科生CS学生(熟练的程序员的基础)毕业后应了解的知识:
数据结构
- 机器数据表示
- 一个,两个的补码及相关算法
- 单词,指针,浮点数
- 位访问,移位和操作
- 链表
- 哈希表(地图或字典)
- 数组
- 树木
- 堆栈
- Queue列
- 图表
- 资料库
演算法
- 排序:
- 冒泡排序(知道为什么不好)
- 插入排序
- 合并排序
- 快速排序
- 基数样式排序,计数排序和存储桶排序
- 堆排序
- Bogo和Quantum Sort(=
- 搜索:
- 字符串操作
- 迭代
- 树遍历
- 列表遍历
- 散列函数
- 哈希表,树,列表,堆栈,队列,数组以及集合或集合的具体实现
- 调度算法
- 文件系统遍历和操作(在inode或等效级别上)。
设计模式
- 模块化
- 厂
- 建造者
- 辛格尔顿
- 适配器
- 装饰器
- 飞行重量
- 观察者
- 迭代器
- 状态[机器]
- 模型视图控制器
- 线程和并行编程模式
范式
- 势在必行
- 面向对象
- 功能性
- 陈述式
- 静态和动态编程
- 数据标记
复杂性理论
- 复杂性空间
- 可计算性
- 常规,上下文无关和通用图灵机完整语言
- 常用表达
- 计数与基本组合
超越
如果您熟悉上述内容,然后再进入问题的后面,您应该可以轻松确定给定方案的适当模式,算法和数据结构。但是,您应该认识到通常没有最佳解决方案。有时,您可能需要从两个弊端中取较小者,甚至只是在两个同样可行的解决方案之间进行选择。因此,您需要具备一些常识才能抵御同行的选择。
以下是有关算法和数据结构的一些技巧:
- 二进制搜索只能(并且应该)用于排序的数据。
- 基数样式排序很棒,但是仅当您要对事物进行有限分类时才可以。
- 树对哈希表几乎无所不能。哈希表的功能可以外推并用于以效率为代价解决许多问题。
- 数组可用于支持大多数更高级别的数据结构。有时,“数据结构”不过是一些用于访问数组中位置的精巧数学。
- 语言的选择可以是将头发拉出问题或解决问题之间的区别。
- ASCII表和128个元素的数组构成一个隐式哈希表(=
- 正则表达式可以解决很多问题,但是不能用于解析HTML。
- 有时,数据结构与算法一样重要。
上面的某些内容似乎没有任何道理,而某些内容似乎含糊不清。如果您想让我进一步介绍,我可以。但是,我的希望是遇到一个更具体的问题,例如“设计一个可计算字符串中每个字符出现次数的函数”,您会看到有关ASCII表和构成整洁的隐式哈希的128个元素数组的提示表的答案。
基于这些想法,我将为您的问题中提出的储物柜问题提出一个答案。
回答问题中提出的问题。
这可能不是您问题的最佳答案,但我认为这是一个有趣的问题,不需要太复杂。这肯定会克服使用队列或堆栈的时间复杂性,而队列或堆栈需要线性时间来确定储物柜是否空闲。
您有0-999个储物柜。现在,由于您有固定数量的储物柜,因此可以轻松构想出散列函数,且不会在0-999范围内发生冲突。这个函数只是h(x)= x mod1000。现在,[概念上]构造一个具有整数键和1000元素char数组的内容作为您的值的哈希表。如果客户想保留储物柜78以供使用,只需将78放入哈希函数中(返回78),然后将该数字添加到数组的基本指针中-将真实值存储在偏移值所指向的位置。同样,如果需要检查是否正在使用78,只需读取存储在该位置的值并检查是否为true。
与二进制树支持的优先级队列的情况相比,此解决方案以固定的时间运行以进行查找和存储,而不是log(n)时间存储和查找。该描述是特意冗长的,因此您可以看到将更高级的概念简化为一种有效的算法。
现在,您可能会问,如果我需要知道所有可用的储物柜,优先级队列会更好吗?如果优先级队列中有k个可用的储物柜,则对所有这些储物柜进行迭代将需要k个步骤。此外,根据优先级队列的实现,您可能需要重建所有优先级队列,这需要k * log(k):(k <1000)步骤。在数组解决方案中,您只需要迭代1000个元素数组并检查哪些数组是打开的。您还可以向实现中添加可用列表或已使用列表,以仅签入k次。