一、冒泡排序
基本思想:
对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。
//冒泡排序
<?php function mysort($arr) { for($i = 0; $i < count($arr); $i++) { $isSort = false; for ($j=0; $j< count($arr) - $i - 1; $j++) { if($arr[$j] < $arr[$j+1]) { $isSort = true; $temp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $temp ; } } if($isSort) { break; } } return $arr; } $arr = array(3,1,2); var_dump(mysort($arr)); ?>
二、快速排序
基本思想:
在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。
//快速排序
<?php //快速排序 function quick_sort($arr) { //先判断是否需要继续进行 $length = count($arr); if($length <= 1) { return $arr; } $base_num = $arr[0];//选择一个标尺 选择第一个元素 //初始化两个数组 $left_array = array();//小于标尺的 $right_array = array();//大于标尺的 for($i=1; $i<$length; $i++) { //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内 if($base_num > $arr[$i]) { //放入左边数组 $left_array[] = $arr[$i]; } else { //放入右边 $right_array[] = $arr[$i]; } } //再分别对 左边 和 右边的数组进行相同的排序处理方式 //递归调用这个函数,并记录结果 $left_array = quick_sort($left_array); $right_array = quick_sort($right_array); //合并左边 标尺 右边 return array_merge($left_array, array($base_num), $right_array); } $arr = array(3,1,2); var_dump(quick_sort($arr)); ?>
三、二分查找
基本思想:
假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)
//二分查找
<?php //二分查找 function bin_search($arr,$low,$high,$k) { if($low <= $high) { $mid = intval(($low + $high)/2); if($arr[$mid] == $k) { return $mid; } else if($k < $arr[$mid]) { return bin_search($arr,$low,$mid-1,$k); } else { return bin_search($arr,$mid+1,$high,$k); } } return -1; } $arr = array(1,2,3,4,5,6,7,8,9,10); print(bin_search($arr,0,9,3)); ?>
四、顺序查找
基本思想:
从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
//顺序查找
<?php //顺序查找 function seq_search($arr,$n,$k) { $array[$n] = $k; for($i = 0;$i < $n; $i++) { if($arr[$i] == $k) { break; } } if($i < $n) { return $i; } else { return -1; } } ?>
<?php function my_scandir($dir) { $files = array(); if($handle = opendir($dir)) { while (($file = readdir($handle))!== false) { if($file != '..' && $file != '.') { if(is_dir($dir."/".$file)) { $files[$file]=my_scandir($dir."/".$file); } else { $files[] = $file; } } } closedir($handle); return $files; } } var_dump(my_scandir('../')); ?>
六、写一个函数,尽可能高效的从一个标准url中取出文件的扩展名
<?php function getExt($url) { $arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分 //'scheme' => string 'http' (length=4) //'host' => string 'www.sina.com.cn' (length=15) //'path' => string '/abc/de/fg.php' (length=14) //'query' => string 'id=1' (length=4) $file = basename($arr['path']);// basename函数返回路径中的文件名部分 $ext = explode('.', $file); return $ext[count($ext)-1]; } print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1')); ?>
七、实现中文字符串截取无乱码的方法
可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。
以上这篇PHP面试常用算法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
共计35min 1、自我介绍 2、介绍一下实习? 大模型微调的样本量大概是多少? 详细介绍推荐算法实习的背景和思路? 3、学习经历 本科学过什么课?编程相关的?运筹优化相关的?实验室研究方向是啥? 4、八股 大模型和推荐结合的地方有什么?想做大模型还是推荐? 对推荐系统的哪些地方感兴趣?了不了解召回?有哪些算法?了不了解排序?有哪些算法?介绍一下SENET?用户冷启动怎么做? 推荐系统物品点击率的
乱序 1、有了解fm吗。不太熟悉,核心思想是将wij分解为vil和vlj。 2、transformer的注意力机制。x复制3份,交由三个权重矩阵得到qkv,softmax(qk^T)/(根号dk)*v。之后就是一些具体在干嘛的,我说的用这个做的机器翻译,当时是纯手打完transformer成所以比较熟悉,记忆比较深刻,但是面试官好像没继续深入问下去。 3、说一下mmoe。这是一个多任务的双塔模型,
自我介绍 简单介绍一下这个推荐项目 用户数据量和内容数据量,总共有多少特征,具体是大概有哪些特征,用户行为序列用到了吗? 一个特征有多个值的情况是怎么处理的? 有做特征选择吗?训练数据量多大?多路召回怎么做的?多路召回有几路?多路召回是怎么融合的? 有做粗排吗? 召回的离线指标和线上指标大概是什么情况? 用户的冷启动是怎么做的? 介绍一下 GrapSAGE,word2vec, deepwalk,
讲一下面试候选人的心得: 第一、我在做面试官时,比较喜欢基础扎实的、工程能力好的候选人。 算法工程师,首先是工程师,得会编程,会自己上线算法模型。不是参加算法竞赛,跑几个模型就可以的。 我本身比较喜欢科班出身的,因为他们计算机基础都不错。在我们这个行业(推荐方向),是很看重工程能力。 很多刚毕业的应届生,他们会觉得搞一个复杂的深度模型,就能解决问题,这个是万万不可取的。 一定要扎扎实实做工程,贴近
一面: 1. 对推荐算法大概有多少了解 2. kaggle比赛用了什么模型,做了什么优化 3. 你是如何把几个模型的分数做融合的 4. 如果这个权重也作为一个变量参与到训练,这种方式和你手动调参相比会有什么样的差异呢 这题我回答的是串行训练会更多耗时,但是参数精度会提高效果会更好,但是总觉得还是没答到点子上 5. 随机森林的具体运行过程 6. 如何判断过拟合和欠拟合,怎么解决 7. 如何解决梯度消
自我介绍 对推荐算法了解如何 项目深挖 两个项目都是kaggle上的,面试官还吐槽怎么全是kaggle(这不是非科班没有项目只能硬整两个么) 打比赛模型大家都差不多,如何进行提升 介绍一下transfermer 手写一下transfermer的自注意力的公式 求数组中第k大的数(写了个nlogn的归并,经面试官提醒发现可以用快排写o(n),但是快排忘了) 反问 面试了一个小时,体验还行,面试官看我