吸取经验
堆跟栈的区别
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
如何反转单链条
安卓四大组件
Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。
生命周期?
python修饰器
在面向对象(OOP)的设计模式中,decorator被称为装饰模式。OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator。Python的decorator可以用函数实现,也可以用类实现。
decorator可以增强函数的功能,定义起来虽然有点复杂,但使用起来非常灵活和方便。
动态规划的用法
1背包问题
2一共有n个管道,每个管道的价格和流量不同,一个设备由不同的管道构成,每种管道有多种选择,他们的价格或流量不同,结果应选出价格之和最小与最小管道流量最大的组合。
作者:知乎用户
链接:https://www.zhihu.com/question/23995189/answer/35392247
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
首先,动态规划是一种算法。那么,何谓算法?计算机书籍中不难找到其严谨的学术定义,大众可以简单理解为“解决某一类问题的核心思想”。先谈动态规划的意义——望文生义,“动态”规划对应“动态”的问题:你并不知道问题的规模会有多大,而不论是个位数还是百万级,都能以较快速度(动态规划是一种泛用性算法,而泛用性算法与特定算法相比往往存在性能差距)将结果正确计算出来。这是对于计算机科学最直观的意义,当然我认为其对人生亦有一定指导意义,但那是见仁见智的事了。动态规划这一思想的实质其实是以下两点:1.分析问题,构造状态转移方程2.以空间换时间让我们结合一个简单例子来理解一下:以乘法计算为例,乘法的定义其实是做n次加法,请先忘掉九九乘法表,让你计算99,如何得到81这个解?计算910呢?9999……以及9n呢?1.分析问题,构造状态转移方程“状态转移方程”的学术定义亦可简单找到(比如置顶答案),略去不表。光看“方程”二字,可以明白它是一个式子。针对以上问题,我们构造它的状态转移方程。问题规模小的时候,我们可以容易得到以下式子:90=0;91=0+9;92=0+9+9;……可以得到:9n=0+9+…+9(总共加了n个9)。严谨的证明可以使用数学归纳法,略去不表。现在,定义dp(n)=9n,改写以上式子:dp(0)=90=0;dp(1)=91=dp(0)+9;dp(2)=92=dp(1)+9;……作差易得:dp(n)=dp(n-1)+9;这就是状态转移方程了。可以看到,有了状态转移方程,我们现在可以顺利求解9n(n为任意正整数)这一问题。2.以空间换时间虽然能解,但当n很大时,计算耗时过大,看不出状态转移方程dp(n)=dp(n-1)+9与普通方程9n=0+9+…+9(总共加了n个9)相比没有任何优势。这时,如果dp(n-1)的结果已知,dp(n)=dp(n-1)+9只需计算一次加法,而9*n=0+9+…+9(总共加了n个9)则需计算n-1次加法,效率差异一望即知。存储计算结果,可令状态转移方程加速,而对普通方程没有意义。以空间换时间,是令动态规划具有实用价值的必备举措。
条件随机场
条件随机场(Conditional random fields),是一种判别式图模型,因为其强大的表达能力和出色的性能,得到了广泛的应用。从最通用角度来看,CRF本质上是给定了观察值集合(observations)的马尔可夫随机场。在这里,我们直接从最通用的角度来认识和理解CRF,最后可以看到,线性CRF和所谓的高阶CRF,都是某种特定结构的CRF。
TensorFlow的Tensor是啥
TensorFlow是Google在2015年11月份开源的人工智能系统(Github项目地址),是之前所开发的深度学习基础架构DistBelief的改进版本,该系统可以被用于语音识别、图片识别等多个领域。
官网上对TensorFlow的介绍是,一个使用数据流图(data flow graphs)技术来进行数值计算的开源软件库。数据流图中的节点,代表数值运算;节点节点之间的边,代表多维数据(tensors)之间的某种联系。你可以在多种设备(含有CPU或GPU)上通过简单的API调用来使用该系统的功能。TensorFlow是由Google Brain团队的研发人员负责的项目。
什么是数据流图(Data Flow Graph)
数据流图是描述有向图中的数值计算过程。有向图中的节点通常代表数学运算,但也可以表示数据的输入、输出和读写等操作;有向图中的边表示节点之间的某种联系,它负责传输多维数据(Tensors)。图中这些tensors的flow也就是TensorFlow的命名来源。
节点可以被分配到多个计算设备上,可以异步和并行地执行操作。因为是有向图,所以只有等到之前的入度节点们的计算状态完成后,当前节点才能执行操作。
卷积神经网络中可调设的参数
每个神经元都得到一些输入数据,进行内积运算后再进行激活函数运算。整个网络依旧是一个可导的评分函数:该函数的输入是原始的图像像素,输出是不同类别的评分。在最后一层(往往是全连接层),网络依旧有一个损失函数(比如SVM或Softmax),并且在神经网络中我们实现的各种技巧和要点依旧适用于卷积神经网络。
面向过程和面向对象的区别
面向过程就是分析出解决问题所需的步骤,面向对象则是把构成问题的事物分解成对象,抽象出对象的目的并不在于完成某个步骤,而是描述其再整个解决问题的步骤中的行为。
面向过程的思维方式是分析综合,面向对象的思维方式是构造。
例如C语言解决问题时,一般是先定义数据结构,然后在构造算法。而是用Java面向对象求解时则是先抽象出对象,构造一个“封闭”的环境,这个环境中有定义的数据和解决问题的算法。
面向过程的设计更具挑战性,技巧性,面向对象主要在于对象抽象的技术性,一旦完成抽象,任何人都可以做后面的工作了。
从代码层结构上来说的话,面向对象和面向过程的主要区别就是数据是单独存数还是与操作存储
在一起。面向对象提供了数据的封装后,是的对某一操作而言,数据的访问变得可靠了。
面向过程就是将coding当做一件事,一步一步完成,面向对象就是将coding当做一件事物,需要
做什么的时候由事物(对象)本身的行为去完成。
总的来说:
面向对象是将事物高度抽象化。面向过程是一种自顶向下的编程。面向对象必须先建立抽象模型,之后直接使用模型就行了。
进程和线程
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。
对于操作系统而言其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务。
进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中。
每个进程至少需要一个线程。
进程由两部分构成:进程内核对象,地址空间。线程也由两部分组成:线程内核对象,操作系统用它来对线程实施管理。线程堆栈,用于维护线程在执行代码时需要的所有函数参数和局部变量。
进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。
如果在单进程环境中,有多个线程正在运行,那么这些线程将共享单个地址空间。这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而不是每个线程存在。
进程使用的系统资源比线程多得多。实际上,线程只有一个内核对象和一个堆栈,保留的记录很少,因此需要很少的内存。因此始终都应该设法用增加线程来解决编程问题,避免创建新的进程。但是许多程序设计用多个进程来实现会更好些。
线程是一种操作系统对象,代表着一个进程中要被执行的代码的路径。每一个WIN32应用程序至少有一个线程–通常称为住线程或默认线程–但应用程序可以自由地创建其他线程来执行其他任务!
进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程
线程是比进程更小的执行单位。一个进程在其执行过程能够中,可以产生 多个线程,形成多条执行线索。每条线索,即每个线程也有它自身的产生、存在和消亡过程,也是一个动态的概念。
一个程序应该只有一个进程吧,但是可以拥有多个线程。
可以说,一个执文件被运行后,就可以称为是一个进程了。但是进程只是存在内存中,实际上他是不会做任何事情的。
这个时候,起作用的就是线程了。线程是程序的执行者,一个程序至少有一个线程,但是在多线程的操作系统中,可以有一个以上的线程。
其实我们可以把线程看成是我们排队买肯德鸡吃(循环的排队,一直排下去,知道我不想买了,退出)。每人都有机会到达队伍的最前端去买东西,这个就好比是线程,都有机会被程序执行。但是线程真正起作用的时候,就是我们在队伍的最前端买东西到东西买完后,这一段时间,这是线程真正执行的阶段。