PHP之算法偶遇隨感
php真的很棒,很多函數把我們想要的功能都簡單實現了,是項目快速開發的首選.說實話,在BS程序開發方面我認為最好的兩種語言是PHP和JSP,我之前曾學過一段時間的java,確實很棒完全的OOP,但是它太"龜毛"了,雖然他的優點有很多,但是想要實現快速開發幾乎是不大可能的,太多的東西需要遵循,而在這方面PHP就好的太多了,但是也正因為如此讓眾多的PHPER們忽略了算法的重要性,好了言歸正傳我們今天就來討論一個算法.
昨天我在開發一個項目的時候遇到了一個難題,就是過關組合的部份,我曾研究過類似的代碼,發現人家循環了7層,看得我眼冒金星,至於效率就更甭提了,於是我就想自己寫一個函數來處理這部份,首先要效率高,其次是要能滿足我的需求,整了半天愣是沒有整出來,下邊是我發在CSDN上的一篇求救文:
请帮忙写一个函数,用来重新组合字符串,大概如下:
/**
参数:
$arr:需要被重新組合的原始Array
$len:组合后的长度
/**/
Function getArray($arr,$len){
//请帮忙写
}
$arr=Array('A','B','C');
print_r(getArray($arr,2));
$arr=Array('A','B','C','D','E','F');
print_r(getArray($arr,4));要求如下:
第1种: A,B,C
期望能够得到的组合是: AB,AC,BC
第2种: A,B,C,D(可通过参数控制结果长度,如长度为2或3)
期望能够得到的组合是: AB,AC,AD,BC,BD,CD或ABC,BCD,ACD,ABD
第3种: A,B,C,D,E(可通过参数控制结果长度,如长度为2;3或4)
期望能够得到的组合是: AB,AC,AD,AE,BC,BD,BE,CD,CE,DE或ABC,BCD,CDE,ABD,ABE,ACD,ACE,BDE,BCE,ADE或ABCD,BCDE,ABCE,ACDE,ABDE
第四种:A,B,C,D,E,F(可通过参数控制结果长度,如长度为2;3;4或5)
期望能够得到的组合是: 可根据上边的组合推演出来,在此不再例举
上邊的要求貌似很簡單,但是真正當我開始寫的時候才發現竟然一點頭緒都沒有,我曾設想過用遞歸等做法但是想來想去都覺得不可行,放狗搜了半天也找不到類似的做法,只發現有人用C語言寫過一個函數,但是當我把C語言代碼改成PHP執行的時候和預期的效果差很大.最後沒辦法只好在CSDN花費了寶貴的200點積分請高手來解決,俗話所的好"重賞之下有勇夫",哈哈這句話果真一點都不假,很快PHP版的斑竹"xuzuning"就給了我三個答案,汗!!!最後通過十萬次的循環測試選中了一個最佳解決方案,代碼如下:
/**
重新組合Array,例如(2x3;3x3;3x4)
返回:
重組後的Array
參數:
$arr:要重組的Array
$len:幾個Array組合到一起
用法:
$arr=Array('A1','B2','C3','D4','E5','f');
$x3=Fun::CombiArray($arr,3);
/**/
Public Static Function combiArray($arr,$len){
$cr = Range(0,$len-1);
$k = False;
$total = Count($arr);
While($cr[0] < $total-($len-1)) {
$t = Array();
For($i=0;$i<$len;$i++){$t[]=$arr[$cr[$i]];}
$r[] = $t; For($i=$len-1;$i>=0;$i--) {
$cr[$i]++;
For($j=$i;$j<$len-1;$j++){$cr[$j+1] = $cr[$j]+1;}
IF($cr[$i] < $total-($len-$i-1)){Break;}
}
}
Return $r;
}
很棒的算法,看了老半天才看明白,比起某人寫的那7層循環不知道效率提升了多少倍.
PHP成就了快速開發,卻也讓程序員變笨了,看來得惡補一下算法了,在算法方面有沒有啥比較好的書啊?大家可否推薦給我幾本?
..
PHP之算法偶遇隨感的更多相关文章
- PHP之算法
PHP之算法偶遇隨感 要求如下: 第1种: A,B,C 期望能够得到的组合是: AB,AC,BC 第2种: A,B,C,D(可通过参数控制结果长度,如长度为2或3) 期 ...
- Java 密码学算法
Java 密码学算法 候捷老师在< 深入浅出MFC 2e(电子版)>中引用林语堂先生的一句话: 只用一样东西,不明白它的道理,实在不高明 只知道How,不知道Why,出了一点小问题时就无能 ...
- Learn Algorithms With Javascript - 基于 Js 进行算法学习
基于 javascript 学习并实现常用的经典算法,欢迎对算法和数学感兴趣的 Js 开发者参与,一起学习共同进步. 算法实现 排序 插入排序 sort/lib/insertion-sort.js 希 ...
- (转)Boyer-Moore算法
转自:Boyer-Moore算法 一.简述 在当前用于查找子字符串的算法中,BM(Boyer-Moore)算法是当前有效且应用比较广的一中算法,各种文本编辑器的“查找”功能(Ctrl+F),大多采用B ...
- 1、学习算法和刷题的框架思维——Go版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- python类中的super,原理如何?MRO是什么东东?
下面这个URL解释得比较清楚. http://python.jobbole.com/86787/?utm_source=group.jobbole.com&utm_medium=related ...
- PCL—低层次视觉—关键点检测(rangeImage)
关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知对低层次处理手段的妥协. ——三维视觉关键点检测 1.关键点,线,面 关键点=特征点: 关键线=边缘: 关键面=foregro ...
- Python super使用
一 基础使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如: #!/usr ...
- Android Multimedia框架总结(二十四)MediaMuxer实现手机屏幕录制成gif图
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53866405 前言:上篇中,介绍 ...
随机推荐
- iOS 1 到 iOS 10 ,我都快老了
iOS 1:iPhone诞生 虽然很难想像,但初代iPhone在问世时在功能方面其实远远落后于那时的竞争对手,比如Windows Mobile.Palm OS.塞班.甚至是黑莓.它不支持3G.多任务. ...
- [付费视频]Delphi视频Android开发使用静态库(A)和动态库(SO)
关于本视频:前阵子接到一个委托,解决Delphi开发Android程序中串口通信的问题,厂家那边提供了c文件,需要翻译成delphi可用,翻译倒是比较简单.不过后来翻译读写ic卡单元的时候进行不下去了 ...
- 一个有趣的基于C++的模拟发牌程序
在内存中模拟出一副牌,然后模拟洗牌,发牌等动作. 流程是这样的:构建一副牌保存到一个数组中—洗牌—创建玩家—向玩家发牌–输出每个玩家的牌. #include <stdio.h> #incl ...
- 使用PreTranslateMessage替代钩子函数处理键盘消息
2002年左右,我所在公司在开发基于H.323的VoIP电话系统(用了以色列一家公司的库,具体名字忘记了). 去电信科技研究院测试系统,同事发现处理键盘消息总有一些莫名其妙的问题,比如延迟或异常. 我 ...
- Jplayer歌词同步显示插件
http://blog.csdn.net/wk313753744/article/details/38758317 1.该插件是一个jquery的编写的跟jplayer实现歌词同步的插件,最终效果如图 ...
- asp控件Repeater运用
双层repeater嵌套 <asp:Repeater ID="rpt_dataRepeatgroup" runat="server" OnItemData ...
- FastDFS基本结构(转)
0.简介 FastDFS是基于互联网应用的开源分布式文件系统,主要用于大中型网站存储资源文件,如图片.文档.音频.视频等.FastDFS采用类似GFS的架构,用纯C语言实现,支持Linux.FreeB ...
- MVC项目创建与项目结构介绍
一.创建MVC项目 打开VS202,点击:文件—>新建—>项目—>Web—>Asp.Net MVC 4 Web应用程序 填好项目名称.解决方案名称和文件存放位置,然后点击确定, ...
- java基础学习总结——this关键字
一.this关键字
- 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)
Charm Bracelet POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...