php 数组的几个小算法

1. 判断a数组是否为b数组的子集

1 <?php
2     $a = array(‘apple‘,‘orange‘);
3     $b = array(‘apple‘,‘banana‘,‘ornage‘);
4
5     $arr = array_diff($a,$b);
6     if($arr){ echo ‘no‘}else {echo ‘yes‘}

在数组比较大,占用巨量内存时,这样比较不合适,可以用下面的

 1 <?php
 2 do{
 3     foreach ($a as $aItem){
 4          if(in_array($aItem,$b)){
 5               continue;
 6           } else{
 7                $flag  = false;break;
 8          }
 9     }
10 }while(0);

2. 输出一个数组的所有子集

 1 $a=array(1,2,3);
 2 $n = count ($a);
 3 $nn = pow(2,$n);
 4 for($i=0;$i<$nn;$i++){
 5   $m=sprintf(‘%0‘.$n.‘b‘,$i);
 6   for($j=0;$j<$n;$j++){
 7     if($m{$j}==0) $tmp[]=$a[$j];
 8   }
 9   $arr[] = ‘[‘.implode(‘,‘,$tmp).‘]‘;
10 }
11 var_dump($arr);

太晚了,就写这俩吧.

时间: 2024-12-29 12:29:44

php 数组的几个小算法的相关文章

关于数组的一些小算法

1.已知两个有序数组A,B,将它们合并为一个有序数组.利用到的是归并算法的思想. int* combine(int a[],int n1,int b[],int n2) { int i = 0,j = 0,k = 0; int *c = new int[n1+n2]; while(i<n1&&j<n2) //依次比较a,b数组当前元素,将小的元素放前面,下标后移 { if(a[i]<=b[j]) c[k++] = a[i++]; else c[k++] = b[j++];

小算法:合并两个有序数组,合并之后仍然有序

1 /** 2 * 合并两个有序数组,合并后仍然有序 3 * @param a 要合并的数组A 4 * @param b 要合并的数组B 5 * @param c 合并后的数组C 6 */ 7 public static void merge(int a[] ,int b[],int c[]){ 8 int lengthA = a.length; 9 int lengthB = b.length; 10 11 int indexA = 0; 12 int indexB = 0; 13 int i

算法导论:快速找出无序数组中第k小的数

题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1).使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n). 在<算法导论>有详细叙述 这里主要用C++实现,实现思路就是先选取当前数组的第一个数作为"主轴",将后面所有数字分成两部分,前面一部分小于"主轴",后面一部

iOS开发——有序数组去重的几种算法

算法,在学校的时候就掌握的不牢固,如今还是要还上了. NSMutableArray *dateMutablearray = [@[] mutableCopy]; NSArray *array1 = @[@"1",@"2",@"3", @"3",@"4",@"5",@"7",@"9",@"9", @"11",]

每天一个小算法(2)----合并两个有序链表

每天一个小算法还是有点没时间,尽量抽出时间写一写. 今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来. 代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^. 在Linux/g++下编译运行成功. 合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾. 1 #include

有序数组去重的几种算法

最差的算法: 最差的算法: 去重,与数组是否有序无关 public void noDups(){ //从0开始遍历 for(int i=0; i<nElems-1; i++){ //与后面每一个比较 for(j=i+1; j<nElems; j++){ //如果相等,后面的所有的项向前移动,总数-1 if(a[i]==a[j]){ for(k=j+1; k<nElems; k++){ a[j] = a[j+1]; nElems--; } } } } } 把后面不同的往前 public v

查找数组中第i小的元素

查找并输出数组中第i小的元素,这样的题目我们可以先对数组进行排序,然后输出相对应的第i小的元素:还有另外一种方法,一种解决选择问题的分治算法,该算法是以快速排序算法为模型的,与快速排序一样,我们仍然将输入数组进行划分,但与快速排序不同的是,快速排序会递归处理划分的两边,而该选择方法select只处理划分的一边.这一差异会在性能分析中体现出来:快速排序的期望运行时间为O(nlog(n)),而select的选择期望运行时间是O(n). 1.对数组进行排序,然后输入第i小的元素,这里排序算法用的是插入

java每日小算法(27)

/* [程序27]  题目:求100之内的素数    */ package test; import java.util.Scanner; public class test { public static boolean prime(int number) { boolean flag = true; int mid = (int)Math.sqrt(number); for(int i = 2; i< mid+1; i++) { if(number % i == 0) { flag = fa

java每日小算法(4)

[程序4] 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步. package test; import java.util.ArrayList;