反转函数
- 两头像中间靠近,算法复杂度为 1/2 。
- 参数为索引,减少内存空间的占据。
- 反转的核心,数据通过第三个变量进行交换。
- 在 foreach 当中 unset 数组变量,并不能使得内存空间释放。
- foreach 操作数组元素,如果是对元素赋值,则内存空间会变大一倍。
二分法
$value) {
$maxIndex = $middleIndex - 1;
} elseif ($arr[$middleIndex] < $value) {
$minIndex = $middleIndex + 1;
} else {
return $middleIndex;
}
}
return -1;
}
// 内容结束
var_dump(dichotomy($arr, 3));
var_dump("使用时间: " . (micro_time() - $start) . " ms");
function micro_time()
{
list($microSecond, $second) = explode(' ', microtime());
return (float)sprintf('%.0f', ((float)$microSecond + (float)$second) * 1000);
}
找出两个有序集合的共同元素,最优算法
$arr2[$j]) {
$j++;
} elseif ($arr1[$i] < $arr2[$j]) {
$i++;
} else {
$intersection[] = $arr1[$i];
$i++;
$j++;
}
}
return array_flip(array_flip($intersection));
}
var_dump(find_common(
[1, 2, 2, 3],
[2, 2, 2, 3, 4, 5]
));
随机打乱一个数组
'1a3bb44a2ac' => 1:a 3:bb 44:a 2:ac
找出 n 以内的质数
= 2) {
$arr = [2];
}
for ($i = 3; $i <= $n; $i += 2) {
$sqrt = intval(sqrt($n));
for ($j = 3; $j <= $sqrt; $j += 2) {
if ($i % $j === 0) {
break;
}
}
if ($j > $sqrt) {
$arr[] = $i;
}
}
return $arr;
}
$n = 23;
var_dump(get_prime($n));
sqrt 是 number 的平方根,如果 3 到 sqrt 的所有奇数都不能被 number 整除,则 number 是质数。
在这个例子中 number 就是 n 内的所有整数的任意一个。
约瑟夫环问题
1) {
$first = array_shift($arr);
if ($i % $k !== 0) {
$arr[] = $first;
}
$i++;
}
return $arr[0];
}
$arr = range(1, 33);
var_dump(get_king($arr, 5));
n 个猴子排成一圈,按 1,2,…,n 依次编号。然后从第 1 只开始数,数到第 m 只,把它踢出圈,从它后面再开始数, 再数到第 m 只,把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。
排序方法 | 时间复杂度(平均) | 时间复杂度(最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 | 复杂性 |
---|---|---|---|---|---|---|
直接插入排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 | 简单 |
希尔排序 | O(nlog2n) | O(n2) | O(n) | O(1) | 不稳定 | 较复杂 |
直接选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 | 简单 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 | 较复杂 |
冒泡排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 | 简单 |
快速排序 | O(nlog2n)O(nlog2n) | O(n2) | O(nlog2n) | O(nlog2n) | 不稳定 | 较复杂 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 | 较复杂 |
基数排序 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O(n+r) | 稳定 | 较复杂 |
冒泡排序
// 冒泡排序
function bubble($arr)
{
$minIndex = 0;
$maxIndex = count($arr) - 1;
for ($i = $minIndex; $i <= $maxIndex; $i++) {
for ($j = 0; $j < $maxIndex - $i; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
$tmp = $arr[$j + 1];
$arr[$j + 1] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}
// 排序算法优化:跑完一趟就判断一次原数组现在是否有序,如果有序;直接 return
function bubble(&$arr)
{
$minIndex = 0;
$maxIndex = count($arr) - 1;
for ($i = $minIndex; $i <= $maxIndex; $i++) {
$isOrdered = 0;
for ($j = 0; $j < $maxIndex - $i; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
$tmp = $arr[$j + 1];
$arr[$j + 1] = $arr[$j];
$arr[$j] = $tmp;
$isOrdered = 1;
}
}
if (!$isOrdered) {
return $arr;
}
}
return $arr;
}
// 优化 2
function bubble(&$arr)
{
$minIndex = 0;
$maxIndex = count($arr) - 1;
$currentSwapIndex = 0;
$maxSwapIndex = $maxIndex;
for ($i = $minIndex; $i <= $maxIndex; $i++) {
$isOrdered = 0;
for ($j = 0; $j < $maxSwapIndex; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
swap($arr[$j], $arr[$j + 1]);
$isOrdered = 1;
$currentSwapIndex = $j;
}
}
if (!$isOrdered) {
return $arr;
}
$maxSwapIndex = $currentSwapIndex;
}
return $arr;
}
时间复杂度:
(n-1) + (n-2) + ... + 1 = n * (n - 1) / 2
=>
n(n-1)/2 = (n^2 - n) / 2
=>O(N^2)
优化后的冒泡排序时间复杂度最优情况是
O(n)
选择排序
选择排序是不稳定的算法
function pick($arr)
{
$count = count($arr);
for($i=0;$i<$count;$i++){
$valueMinIndex=$i;
for($j=$i;$j<$count-1;$j++){
if ($arr[$valueMinIndex] > $arr[$j + 1]) {
$valueMinIndex = $j + 1;
}
}
if ($valueMinIndex !== $i) {
swap($arr[$valueMinIndex], $arr[$i]);
}
}
return $arr;
}
之所以叫选择排序。是因为,它每次都会选择未排序中的最小的,和刚刚排完序的元素进行比较。
在一个很多元素的数组中找出最大的 n 个数
思路,假设前面的 n 个数就是最大的 n 个,找出其中最大的 maxIndexInArray 。再依次比较后面的数,如果比 maxIndexInArray 小,就把值赋给 maxIndexInArray ,再重新找出最大的数。以此类推。。。
function get_min_array($arr, $n)
{
$count = count($arr);
$minArray = [];
for ($i = 0; $i < $n; $i++) {
$minArray[] = $arr[$i];
}
$indexOfMaxInMinArray = get_max_pos($minArray);
for ($j = $n; $j < $count; $j++) {
if ($minArray[$indexOfMaxInMinArray] > $arr[$j]) {
$minArray[$indexOfMaxInMinArray] = $arr[$j];
$indexOfMaxInMinArray = get_max_pos($minArray);
}
}
return $minArray;
}
function get_max_pos($arr)
{
$pos = 0;
$count = count($arr);
for ($i = 1; $i < $count; $i++) {
if ($arr[$i] > $arr[$pos]) {
$pos = $i;
}
}
return $pos;
}
从有序数组中找出绝对值最小的那个
function get_abs_min_value($arr)
{
$count = count($arr);
if ($arr[0] >= 0) {
return 0;
}
if ($arr[$count - 1] < 0) {
return $count - 1;
}
$left = 0;
$right = $count - 1;
while ($left <= $right) {
if ($left === $right) return $arr[$left];
$middle = intval(($left + $right) / 2);
if ($arr[$middle] === 0) return $arr[$middle];
if ($arr[$middle] > 0) {
if ($arr[$middle - 1] < 0) {
return abs($arr[$middle]) >= abs($arr[$middle - 1]) ? $arr[$middle - 1] : $arr[$middle];
} else {
$right = $middle - 1;
}
} else {
if ($arr[$middle + 1] > 0) {
return abs($arr[$middle]) >= abs($arr[$middle + 1]) ? $arr[$middle + 1] : $arr[$middle];
} else {
$left = $middle + 1;
}
}
}
}
从有序数组中,找出 3 个数加起来等于 0 的所有可能
function three_sum($arr)
{
$count = count($arr);
$return = [];
for ($i = 0; $i < $count; $i++) {
$left = $i + 1;
$right = $count - 1;
while ($left < $right) {
$sum = $arr[$left] + $arr[$right] + $arr[$i];
if ($sum > 0) {
$right--;
} elseif ($sum < 0) {
$left++;
} else {
$numbers = "$arr[$i],$arr[$left],$arr[$right]";
if (!in_array($numbers, $return)) {
$return[] = $numbers;
}
$right--;
$left++;
}
}
}
return $return;
}
post、get 差别
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
GET产生一个TCP数据包,POST产生两个TCP数据包。
cookie、session
COOKIE保存在客户端,而SESSION则保存在服务器端
从安全性来讲,SESSION的安全性更高
从保存内容的类型的角度来讲,COOKIE只保存字符串(及能够自动转换成字符串)
从保存内容的大小来看,COOKIE保存的内容是有限的,比较小,而SESSION基本上没有这个限制
从性能的角度来讲,用SESSION的话,对服务器的压力会更大一些
SEEION依赖于COOKIE,但如果禁用COOKIE,也可以通过url传递
如果设置了过期时间,Cookie存在硬盘里
没有设置过期时间,Cookie存在内存里
Linux
1.如何修改文件为当前用户只读#
chmod u=r 文件名
2.Linux进程属性#
进程:是用pid表示,它的数值是唯一的
父进程:用ppid表示
启动进程的用户:用UID表示
启动进程的用户所属的组:用GID表示
进程的状态:运行R,就绪W,休眠S,僵尸Z
复习以前学习的 Linux 知识
awk 命令:https://segmentfault.com/a/1190000009745139
数据大小
电信等公司吹牛,100M,这个 100M 是 100Mbps,是位。到个人电脑上变成了 10MB。因为文件是用 byte 作为单位。