计算机算法设计的关键是什么?
刚看到有人答鸵鸟算法,的确是个很重要的算法。
然后就想到了下面这个sorting算法,虽然不怎么重要,但是挺有意思的。
我觉得这有可能是我这辈子最喜欢的算法了:
Sleep Sort
英语差不多的同学可以看一下Quora上的简介
https://www.quora.com/What-is-sleep-sort
这套算法是4chan上的某个精神病提出的
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int c, char **v)
{
while (--c >1 &&!fork())
sleep(c = atoi(v[c]))
printf("%d\n", c)
wait(0)
return 0
}
用GCC编译,运行的时候把你想要sort的东西当成command line arguments送给可执行文件就行了
代码来源:https://rosettacode.org/wiki/Sorting_algorithms/Sleep_sort
=====以下原答案=====
计算机科学里最重要的算法就是你觉得最重要的算法以外的所有算法。←这是玩笑话
算法是一整个体系,从divide and conquer,dynamic programming,greedy这样的基本分类到randomized, linear programming这种奇怪的东西都是算法体系里重要的一环。算法里还有一个大类就是data structure,这些东西环环相关。
初学算法的同学就是要不断的接触,了解,分析这些乱七八糟的东西,最终达到看到不同的结构,不同的需求能够选择正确的工具。我的第一个算法老师曾经这样说过:there isn't a best algorithm for everything, choose the best tool for your problem
就拿你说的hash来看,你觉得key value pair到处都有用到,就觉得这个算法最重要,O(1)的best case看起来也很诱人。可是能用的地方到底有多少?database天天用range query你告诉我你库只有hash index?不能吧,所以B tree是不是很重要?算法和优化是计算机科学里的一个大项,多少代人的研究成果让你一个hash最重要给概括了,这样是不是有种钦定的感觉?
算法导论多看看,没事的时候上leetcode做做题,多见识见识不同的算法是如何应用的,每次选择一个算法/数据结构就问问自己为什么这样?是hash,是hash先,明明都是hash先来的……key value也好,O(1)也好,还是universal那家伙也好...怎么就做不了sssp呢?以后遇上奇怪的程序也不至于懵逼到:我一个linear programming,怎么就跑maximum cardinality bipartite matching来了呢
至于到底什么算法最重要,能用到的都是最重要的,谢谢
数据结构中评价一个好的算法,应该从四个个方面来考虑,分别是:
一、算法的正确性。
二、算法的易读性。
三、是算法的健壮性。
四、是算法的时空效率(运行)。
算法的设计取决于数据(逻辑)结构,算法的实现取决于所采用的存储结构。数据的存储结构本质上是其逻辑结构在计算机存储器中的实现。为了全面反映一个数据的逻辑结构,它在内存中的映像包括两个方面,即数据元素之间的信息和数据元素之间的关系。
不同的数据结构有相应的操作。数据的操作是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新和排序。
扩展资料
算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法。
算法可以宏泛的分为三类:
一、有限的,确定性算法 这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。
二、有限的,非确定算法 这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。
三、无限的算法 是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。
class Taking{
friend void MaxTaking(Type w[],Type c,int n,bool s[])
private:
void Backtrack(int)
int n
Type* w,c,cw,r
bool* s
bool isfind
}
template<class Type>
void Taking<Type>::Backtrack(int i)
{
if(!isfind)
{
if(i>=n)
{
if(cw==c)
isfind=true
return
}
r-=w[i]
if(cw+w[i]<=c)
{
s[i]=true
cw+=w[i]
Backtrack(i+1)
cw-=w[i]
}
if((cw+r>=c)&&(!isfind))
{
s[i]=false
Backtrack(i+1)
}
r+=w[i]
}
}
template<class Type>
void MaxTaking(Type w[],Type c,int n,bool s[])
{
Taking<Type>X
X.w=w
X.c=c
X.n=n
X.cw=0
X.r=0
X.s=s
X.isfind=false
for(int i=0i<ni++)
{
X.r+=w[i]
}
X.Backtrack(0)
if(X.isfind==false)
for(i=0i<ni++)
{
s[i]=false
}
}
#include<iostream.h>
#include<fstream.h>
void main()
{
fstream outfile
outfile.open("input.txt",ios::in)
char ch
int n=0
int *a,c=0
bool *s
do
{
outfile.get(ch)
} while(ch>'9'||ch<'0')
while(ch<'9'&&ch>'0')
{
n*=10
n+=ch-'0'
outfile.get(ch)
}
a=new int[n]
s=new bool[n]
outfile.get(ch)
while(ch<'9'&&ch>'0')
{
c*=10
c+=(int)(ch-'0')
outfile.get(ch)
}
for(int i=0i<ni++)
{
a[i]=0
do
{
outfile.get(ch)
} while(ch>'9'||ch<'0')
while(ch<'9'&&ch>'0')
{
a[i]*=10
a[i]+=(int)(ch-'0')
outfile.get(ch)
}
}
outfile.close()
MaxTaking(a,c,n,s)
outfile.open("output.txt",ios::out)
char* m=new char[200]
int mpoint=0
for(i=0i<ni++)
{
if(s[i]==true)
{
int w=a[i]
while(w!=0)
{
m[mpoint++]=w%10+'0'
w=w/10
}
m[mpoint++]=' '
}
}
m[mpoint]='\0'
if(mpoint==0)
outfile<<"NO SOLUTION!\n"
else
outfile<<m<<"\n"
outfile.close()
}
《计算机算法设计与分析第5版习题及答案》百度网盘pdf最新全集下载:
链接:https://pan.baidu.com/s/1oxH2d3SdEUN0rx6LJRNBoA
?pwd=8i4l 提取码:8i4l简介:本书是与“十二五”普通高等教育本科国家级规划教材《计算机算法设计与分析(第5版)》配套的辅助教材和国家精品课程教材,分别对主教材中的算法分析题和算法实现题给出了解答或解题思路提示。为了提高学生灵活运用算法设计策略解决实际问题的能力,本书还将主教材中的许多习题改造成算法实现题,要求学生设计出求解算法并上机实现。本书教学资料包含各章算法实现题、测试数据和答案,可在华信教育资源网免费注册下载。本书内容丰富,理论联系实际,可作为高等学校计算机科学与技术、软件工程、信息安全、信息与计算科学等专业本科生和研究生学习计算机算法设计的辅助教材,也是工程技术人员和自学者的参考书。
2..如果你从事其他行业,涉及到编程解决问题的,如编程解决数学中的四色问题,编程实现机器控制,学习这些是必要的。
3..如果你想当一名真正的电脑高手或黑客,你必须掌握算法和程序设计方面的知识,能熟练编写程序。编个木马应该不成问题。
4..如果你想开发你的大脑,拓宽你的思维,学习算法吧!如果你想提高自己解决问题的能力,学习算法吧。如果你想把算法付诸实践,学习程序设计吧!
徐亚学习的知识有:
计算机组成原理、c语言程序设计、算法与数据结构、Java等面向对象的程序设计,还要了解离散数学,混沌学,拓扑学,概率学,掌握一定英语。
计算机程序的三种基本结构是啥?
yezi1950
TA获得超过22万个赞
关注
成为第1930位粉丝
计算机程序的三种基本结构是:顺序结构、分支结构、循环结构
1、顺序结构:
顺序结构是一个程序从第一行一直运行到最后一行,也就是程序从头到尾运行。
2、分支结构:
分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。
3、循环结构:
一般用于重复某段需要不断重复执行的代码。
共同特点:
① 三种结构都是只有一个入口,一个出口。
② 三种结构内都不存在死循环。
不懂指针的人,就等于不会C/C++
不懂委托、引用的人,就等于不会C#
除此之外就是算法设计的共同基础了,像楼上所说的,
你需要熟悉各种数据结构的特性,才能在设计你的算法时用最适合的方法
你需要熟悉各种变量的结构,C语言是可以手动管理内存的,灵活掌握物理地址与逻辑地址对C语言算法设计很有帮助
你需要熟悉各种循环控制结构,这才是程序的真谛,让计算机代替人完成重复性的工作,而算法就是教机器该如何这样做的命令集