php 字符串循环截取,大家都用什么算法实现?

垃圾收集算法是个很大的话题。首先要明确的是,垃圾收集算法和语言不一定是绑定的。比如 Java,不同的 JVM 实现可能采用不同的算法。其次,垃圾收集算法数量庞大,一一列举是不可能的,篇幅所限这里只能给个非常概略的介绍。如果希望对垃圾收集相关算法有个全景式的了解,请参阅本人的译作,

从各种垃圾收集算法最基本的运行方式来说,大概可以分成三个类型:

基本思路是为每个对象加一个计数器,记录指向这个对象的引用数量。每次有一个新的引用指向这个对象,计数器加一;反之每次有一个指向这个对象引用被置空或者指向其他对象,计数器减一。当计数器变为 0 的时候,自动删除这个对象。

引用计数的优点是 1)相对简单,不需要太多运行时(run-time)的支持,可以在原生不支持 GC 的语言里实现。2)对象会在成为垃圾的瞬间被释放,不会给正常程序的执行带来额外中断。它的死穴是循环引用,对象 A 包含一个引用指向对象 B ,同时对象 B 包含一个引用指向对象 A,计数器就抓瞎了。另外,引用计数对正常程序的执行性能有影响(每次引用赋值都要改计数器),特别是在多线程环境下(改计数器要加锁同步)。

基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。

标记-清扫没有无法处理循环引用的问题,不触发 GC 时也不影响正常程序的执行性能。但它的问题是当内存耗尽触发 GC 时,需要中断正常程序一段时间来清扫内存,在内存大对象多的时候这个中断可能很长。

采用或者部分采用标记-清扫的例子非常多,不一一列举了。

基本思路是把整个内存空间一分为二,不妨记为 A 和 B。所有对象的内存在 A 中分配,当 A 塞满的时候,同样从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象复制到 B 去,然后对调 A 和 B 的角色。

相对于标记-清扫,节点复制的主要缺点是总有一半空间空闲着无法利用,另一个比较隐晦的缺点是它使用内存的方式与现有的内存换页、Cache 换入换出机制有潜在的冲突。但它有个很大的优点: 所有的对象在内存中永远都是紧密排列的,所以分配内存的任务变得极为简单,只要移动一个指针即可。对于内存分配频繁的环境来说,性能优势相当大。另外,由于不需要清扫整个内存空间,所以如果内存中存活对象很少而垃圾对象很多的话(有些语言有这个倾向),触发 GC 造成的中断会小于标记-清扫。

同样的,采用或者部分采用节点复制的例子也非常多,不一一列举了。

==== 基本算法介绍完毕的分割线 ====

以上三种基本算法各有优缺点,也各有许多改进的方案。目前工程实践上最为成功的方案应该要算分代(generational)垃圾收集。它的基本思路是这样的:程序中存在大量的临时对象,分配出来之后很快就会被释放,而同时如果一个对象分配出来之后相当长的一段时间内都没回收,那么极有可能它的生命周期很长,尝试收集它会是无用功。所以可以把内存有意识地按“对象年龄”分成若干块,不妨记为老中青(XD),所有的分配都在青代进行,青代塞满只对青代做 GC,然后把存活下来的对象移动到中代,直到中青代都塞满,再把存活下来下来的对象移动到老代 —— 这只是个思路上的例子,实践中分代式垃圾收集算法的方案五花八门,而且常常同时使用了不止一种基本算法(比如青代用节点复制,老代用标记清扫啥的)。

几个有用的php字符串过滤,转换函数,主要是一些字符的安全处理与字符串处理

1.进程和线程的差别。

线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:
(1)
调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

(2)
并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)
拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源
(4)
系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

6C/C++编译器中虚表是如何完成的?

7.谈谈COM的线程模型。然后讨论进程内/外组件的差别。


8
.谈谈IA32下的分页机制

小页(4K)两级分页模式,大页(4M)一级

9.给两个变量,如何找出一个带环单链表中是什么地方出现环的?

一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方   ??

10.在IA32中一共有多少种办法从用户态跳到内核态?


11
.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?

用内存映射或全局原子(互斥变量)、查找窗口句柄.. 
FindWindow
,互斥,写标志到文件或注册表,共享内存。. 

12.如何截取键盘的响应,让所有的‘a’变成‘b’


13
ApartmentCOM中有什么用?为什么要引入?


14
.存储过程是什么?有什么用?有什么优点?

    存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程用于实现频繁使用的查询、业务规则、被其他过程使用的公共例行程序

存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快

15Template有什么特点?什么时候用?



今天群硕笔试,考了好多内容,其中Java占很大部分!

本试卷中最有难度的编程题:给定一个数组,这个数组中既有正数又有负数,找出这个数组中的子数组,此子数组的和最大!

 ADO 的区别?答案:实际上除了能够让应用程序处理存储于DBMS 中的数据这一基本相似点外,两者没有太多共同之处。但是ADO 使用OLE DB 接口并基于微软的COM 技术,而 接口并且基于微软的.NET 体系架构。众所周知.NET 体系不同于COM 体系, ADO是两种数据访问方式。,看起来好像这些概念都广泛被PHP开发人员所了解。这就说明了PHP实际上到底是多专业。

  对于非常小的项目,它可以是一个十分符合人意的编程语言。但是对于较大的和更为复杂的项目,PHP就显出他的薄弱了。当你不断地摸索之后,你会发现笔者提到的某些问题的解决方案。所以,当解决方案已知之后,为什么不能修正他呢?另外为什么这些修补不在手册中提到呢?

  一个开源的语言十分流行是一件好事。但不幸得是,它不是一个伟大的语言。笔者希望所有的问题能有一天得到解决(也许在PHP6?),然后我们就将拥有一个开源语言,他既开源,又好用。

三、编程题:30分 共1题 注意:要求提供完整代码,如果可以编译运行酌情加分。

四、设计题:35分 共1题 注意:请尽可能详细描述你的数据结构、系统架构、设计思路等。建议多写一些伪代码或者流程说明。 
1.    
考虑一个字符串替换的过程,在一个文本文件中含有一些文本内容和一些需要替换的变量,变量的格式为“$Var$”,原来的“$”使用“$$”进行转义,原来的“$$”表示为“$$$”。我们将含有变量的文件称为模板(文件名为t),文本文件的平均长度为100K。另外,还有一系列的变量文件,里面为变量名和变量值的对应关系(文件名为1.v

百度114网上笔试题及答案(仅供参考)
1
C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
n)
memmove函数的功能是拷贝src所指的内存内容前n个字节dest所指的地址上。

英文拼写纠错:在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包含了正确英文单词的词典,请你设计一个拼写纠错的程序。1)请描述你解决这个问题的思路;
2)请给出主要的处理流程,算法,以及算法的复杂度;3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。 寻找热门查询:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个
。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G1)请描述你解决这个问题的思路;
2)请给出主要的处理流程,算法,以及算法的复杂度。
(1)
思路 : 字典以字母键树组织,在用户输入同时匹配 流程:每输入一个字母: 沿字典树向下一层,
a
)若可以顺利下行,则继续至结束,给出结果;
b)
若该处不能匹配,纠错处理,给出拼写建议,继续至a);算法:
1.
在字典中查找单词
字典采用27叉树组织,每个节点对应一个字母,查找就是一个字母一个字母匹配.算法时间就是单词的长度k.
2.
纠错算法
情况:当输入的最后一个字母不能匹配时就提示出错,简化出错处理,动态提示可能 处理方法:
(a)
当前字母前缺少了一个字母:搜索树上两层到当前的匹配作为建议;

(b)
当前字母拼写错误:当前字母的键盘相邻作为提示;(只是简单的描述,可 以有更多的)根据分析字典特征和用户单词已输入部分选择(a),(b)处理复杂性分析:影响算法的效率主要是字典的实现与纠错处理
a)字典的实现已有成熟的算法,改进不大,也不会成为瓶颈;
(b)
纠错策略要简单有效 ,如前述情况,是线性复杂度;
(3)
改进策略选择最是重要,可以采用统计学习的方法改进。
(2)首先逐次读入查询串,算哈希值,保存在内存数组中,同时统计频度(注意值与日志项对应关系)选出前十的频度,取出对应的日志串,简单不过了。哈希的设计是关键。 
1)思路:先将集合按照大小排列后,优先考虑小的集合是否与大的集合有交集。有就合并,如果小集合与所有其他集合都没有交集,则独立。独立的集合在下一轮的比
较中不用考虑。这样就可以尽量减少字符串的比较次数。当所有集合都独立的时候,就终止。2)处理流程:
1.
将集合按照大小排序,组成集合合并待处理列表
2.
选择最小的集合,找出与之有交集的集合,如果有,合并之;如果无,则与其它集合是独立集合,从待处理列表 中删除。
3.
重复直到待处理列表为空算法:
1
。将集合按照大小从小到大排序,组成待处理的集合列表。
2
。取出待处理集合列表中最小的集合,对于集合的每个元素,依次在其他集合中搜索是否有此元素存在:
1>
若存在,则将此小集合与大集合合并,并根据大小插入对应的位置 。转3。
2>
若不存在,则在该集合中取下一个元素。如果无下一个元素,即所有元素都不存在于其他集合。则表明此集合独立,从待处理集合列表中删除。并加入结果集合列表。转3
3
。如果待处理集合列表不为空,转2如果待处理集合列表为空,成功退出,则结果集合列表就是最终的输出。算法复杂度分析:假设集合的个数为n,最大的集合元素为m
排序的时间复杂度可以达到
n*log(n)然后对于元素在其他集合中查找,最坏情况下为(n-1*m查找一个集合是否与其他集合有交集的最坏情况是m*m*(n-1)合并的时间复杂度不会超过查找集合有交集的最坏情况。
所以最终最坏时间复杂度为O(m*m*n*n)需要说明的是:此算法的平均时间复杂度会很低,因为无论是查找还是合并,都是处于最坏情况的概率很小,而且排序后优先用最小集合作为判断是否独立的对象,优先与最大的集合进行比较,这些都最大的回避了最坏情况。
(3)
可能的改进:首先可以实现将每个集合里面的字符串按照字典序进行排列,这样就可以将查找以及合并的效率增高。另外,可能采取恰当的数据结构也可以将查找以及合并等操作的效率得到提高

C++开发的时候,用来做基类的类的析构函数一般都是虚函数。

    也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
    
所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

我要回帖

更多关于 php截取字符串以特定的字符分割 的文章

 

随机推荐