首页 运维 linux运维 一条项目中常用的linux命令引发的经典算法题

一条项目中常用的linux命令引发的经典算法题

Jun 23, 2017 pm 02:14 PM
linux 实际的 项目

  小时候家里定了《读者》的月刊,里面记录一个故事:说有有个偏僻的乡村一日突然来了一个美女,她携着万贯家财子女在当地安家落户,成了当地的乡绅。她让她的子女世世代代的保守这个秘密,直到这个秘密不会再对家族带来灾难。她就是陈圆圆。当年吴三桂领清兵入关,冲冠一怒为红颜,改写了中国的历史,自己却能全身而退的那个人。

  周五例行公事的查看一下离线数据推送项目的数据和log。将log用awk分段之后,我想知道实时数据前10个被重复发送的数据ID都被重复发送了几次,从而找到进一步优化的入手点,天知道我对这个项目已经进行了多少次优化了。于是linux命令就是

 cat transmission.log |grep 'IncrementAlbumService.java:146'|awk '{print $6}'|awk -F ',' '{print $1}'| sort |uniq -c| sort -nr |head
登录后复制

  得到的结果令我很自责

(数据安全,对于我们项目的ID规则部分不显示)

虽然这和他们的操作有关,我本来就是该检测到数据变更就发送出去,但是对于这么大的重发率。不管从更新服务的接口上,还是离线服务上,能够优化的点还是有的。姑娘我的思路一向与那些出场要用吹风机,人工喷壶制造画面感的男神大佬思路不同。除了这个结果,我还在想另外一个经典算法问题:说是有一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前十个词。

  这个算法问题使用上面的linux命令就是sort|uniq -c |sort -nr | head。时间复杂度为下面几项中最大的一个:

  1>先是做一次排序,

    直接插入排序:不断将元素插入到有序表中去,最坏时间复杂度是O(n2)

    shell排序:缩小增量的插入排序,不稳定,有赖于增量因子序列的选取,最坏时间复杂度是O(n2)

    简单选择排序:在要排序的数中选择最小或最大与第一个未排序位置交换,最坏时间复杂度是O(n2)

    二元选择排序:每趟简单选择排序确定两个元素,可减少一半的循环。

    堆排序:树形选择排序,大根堆,小根堆。最坏时间复杂度是O(N*logN)

    冒泡排序:每次相邻的两个数比较,交换,最坏时间复杂度是O(n2)

    快速排序:选择基准元素,每次将待排序元素分割,最坏时间复杂度是O(n2)

    归并排序:将两个有序表合成一个新的有序表,最坏时间复杂度是O(N*logN)

    桶排序:以空间换时间的算法,复杂度接近O(n)  

    基数排序:按照个十百千的位数进行分配收集,时间复杂度是O(dn)

   2>uniq 时间复杂度为O(n)

   3>sort时间服务度同1>

   4>已经排好序了时间复杂度就是O(1)

  采用的算法也和文件的大小有关系,如果文件太大,数据太多,就需要将文件拆分,分别排序后做多路归并。所以这里说了文字数量。

  不用linux命令,经典的解决方法是先用字典树统计词频,再用大根堆。先介绍一下字典树,也叫tire树。因为搜索引擎常用这个来做文本词频统计,分词算法也用这个作为基本数据结构,所以知道一些。它的优点是:最大限度的减少无谓的字符串比较,查询效率高于哈希表。核心思想是以空间换时间,利用公共前缀来降低查询时间的开销。所以一说统计啥啥,首先想到的就是字典树。如果在统计词频时维护一个前十位的最大词频数组之类的,在循环处理中比较,时间复杂度要翻10倍。所以还是先统计,再取top10时间效率上更为合适。

  其实我不咋懂算法,只是会用。我之前一个同事看了我写的一篇文章微信问我:“feed流是很有技术含量的工作吗?” 他这个问题让我想起《仙剑》里李逍遥在餐馆里非要装高富帅,说要点最名贵的菜:“青菜炒牛肉”,众人哄笑,灵儿问李逍遥:“逍遥哥哥,青菜炒牛肉是很名贵的菜吗?”。虽然同事是在真心的问我意见,因为他在京东,正在考虑要不要去陌陌,我却感觉自己像那个没见过世面的李逍遥。feed流这个业务逻辑怎么都能做,有没有技术含量取决于怎么去做。我写过一篇专利,介绍feed流的一种拼装方法,流程没走完,这之前我就先不公开计算方法了。但是努力去想的话,优化点还是很多的。前年我还比较喜欢玩朋友圈的时候,经常会发现自己删除的朋友圈又出现了,或者自己的或者别人的朋友圈突然最近的数据全没了,只有很老的数据,比如一年前两年前的数据,一天之后自动恢复。都是策略的问题。微信朋友圈的问题挺多的。鉴于我们有个人见人爱花见花开的产品mm是微信架构师家属,我就不过多吐槽了。

  虽说今天是周日,可以脑洞大开一下,也得有个主题。前面的例子有个经典的top K问题。因为搜索引擎会经常需要统计最热门的查询串,top K问题是基础。TopK问题用小根堆。维护一个K大小的小根堆,遍历要比较的元素,分别与跟元素做对比,如果小于根元素,说明肯定进不了前K,淘汰掉。如果大于根元素,就淘汰根元素。再调整树为最小堆,继续比较。

  最小堆的是一棵完全二叉树,每个非叶子节点的值都不大于其子节点的值。如果破坏了这个规律,就要从第一个非叶子节点开始向根节点这种自下往上的顺序进行调整。

  下周决定面一下hulu,还没面,应该是面不过。两年前原同事给推荐过亚马逊,结果没让我去面试,安慰自己一下就是估计那时候他们其实是不招人的。从来没去过这种外企面试,不知道是啥套路。如果现在开始准备的话,估计过了十一差不多能过。我想我自己去面试肯定很不占优势。不是完全会不好,会很不稳定。看过我文章朋友大概会觉得我文章写的很乱,很杂。生活中我也确实是这样。知识面很广,很异想天开,无所顾忌,这一方面为我的创造力奠定基础,另一方面不利于我临场发挥。大脑像是一个电脑。我的并行程序很多,内存不够大,数据又多。内存分页导致不断和磁盘swap。面试这种有时效的动作很容易导致超时返回。我有那么多技术发明专利,现在让我想,我一个都想不起来自己发明了啥。刚刚坐公交车,因为人很少,司机师傅问我哪里下车,意思是没有人下车的地方就不停了。我想了很久才想起来。我的大脑更多运行在异步非阻塞模式,其实面试这种事情同步阻塞反而会好一些。然而任何事情都有解决的办法,找不到方法就是能力不够了,没什么不服的。然而面试是要考察综合能力的,比如团队合作,谈吐能力等等。相信我们部门的人都不会对“晓静很聪明“这句话有异议。也相信部门或者工作上有合作的同事都不会觉得我是个很难沟通或者很难相处的人。但是在面试中我却很可能会忘了要怎么说话。但是如果因为这个问题我没通过一个面试的话,我没有怨言。因为面试官就是将来的同事和领导,如果不够合拍的话,将来去了自己的能力也不一定能发挥出来。如果面试不好还觉得自己能力是够的,那很有可能是自己格局不够高,没见过真正优秀的人是什么样子。然而我就是那种铁定要碰壁的事还要做的人。如果一件事我决定放弃了,原因肯定是不值得做。

  喜欢工作,我的目标是60岁时还能有一份有创造性的工作。所以怕国内互联网公司会让我40岁就退休。还有一件最重要的事:我想做自己的搜索引擎中间件,国内的互联网公司以用为主,怕是我很难有精力来做这件事情。当然,去不了hulu,搜索引擎也还是要做的。只是一个怎样分配时间的问题。

  我其实是喜欢去碰壁的,大概是自己还不想那么快长大吧。如果天天表现的很成熟优雅的样子,就需要隐藏一些自己不擅长的,或者有可能出错的事儿。结果每天日子也会很开心,但是可能一辈子也就这样了。历史上有很多著名的人物,原本都是纨绔子弟,后家道中落才逆袭成为伟人的。书里,人生的转折有遇到贵人,和遇到挫折两种。年轻时心态开放,遇到贵人打开思路就可以顿悟了。而随着经历的增多,人会更加有选择的接收周围的信息,这时候大概需要遇到很大的挫折才能重新思考人生。如果能看到更好的未来,我愿独孤一掷,破釜沉舟。大起大落总好过一年如一日,要活就活的精彩~~

以上是一条项目中常用的linux命令引发的经典算法题的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

deepseek网页版入口 deepseek官网入口 deepseek网页版入口 deepseek官网入口 Feb 19, 2025 pm 04:54 PM

DeepSeek 是一款强大的智能搜索与分析工具,提供网页版和官网两种访问方式。网页版便捷高效,免安装即可使用;官网则提供全面产品信息、下载资源和支持服务。无论个人还是企业用户,都可以通过 DeepSeek 轻松获取和分析海量数据,提升工作效率、辅助决策和促进创新。

deepseek怎么安装 deepseek怎么安装 Feb 19, 2025 pm 05:48 PM

DeepSeek的安装方法有多种,包括:从源码编译(适用于经验丰富的开发者)使用预编译包(适用于Windows用户)使用Docker容器(最便捷,无需担心兼容性)无论选择哪种方法,请仔细阅读官方文档并充分准备,避免不必要的麻烦。

如何解决Linux终端中查看Python版本时遇到的权限问题? 如何解决Linux终端中查看Python版本时遇到的权限问题? Apr 01, 2025 pm 05:09 PM

Linux终端中查看Python版本时遇到权限问题的解决方法当你在Linux终端中尝试查看Python的版本时,输入python...

BITGet官方网站安装(2025新手指南) BITGet官方网站安装(2025新手指南) Feb 21, 2025 pm 08:42 PM

BITGet 是一款加密货币交易所,提供各种交易服务,包括现货交易、合约交易和衍生品。该交易所成立于 2018 年,总部位于新加坡,致力于为用户提供安全可靠的交易平台。BITGet 提供多种交易对,包括 BTC/USDT、ETH/USDT 和 XRP/USDT。此外,该交易所还在安全性和流动性方面享有盛誉,并提供多种功能,如高级订单类型、杠杆交易和 24/7 全天候客户支持。

gate.io安装包免费拿 gate.io安装包免费拿 Feb 21, 2025 pm 08:21 PM

Gate.io是一款受欢迎的加密货币交易所,用户可通过下载其安装包并安装在设备上使用。获取安装包步骤如下:访问Gate.io官方网站,点击“下载”,选择对应操作系统(Windows、Mac或Linux),将安装包下载至计算机。安装过程中建议暂时禁用杀毒软件或防火墙,确保安装顺利。完成后,用户需创建Gate.io账户以开始使用。

欧易okx安装包直接进 欧易okx安装包直接进 Feb 21, 2025 pm 08:00 PM

欧易 OKX,全球领先的数字资产交易所,现推出官方安装包,提供安全便捷的交易体验。欧易 OKX 安装包无需通过浏览器访问,可直接在设备上安装独立应用程序,为用户打造稳定高效的交易平台。安装过程简便易懂,用户只需下载最新版本安装包,按照提示一步步操作即可完成安装。

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

欧易交易所下载官方入口 欧易交易所下载官方入口 Feb 21, 2025 pm 07:51 PM

欧易,又称OKX,是一个全球领先的加密货币交易平台。文章提供了欧易官方安装包的下载入口,方便用户在不同设备上安装欧易客户端。该安装包支持 Windows、Mac、Android 和 iOS 系统,用户可根据自己的设备类型选择相应版本下载。安装完成后,用户即可注册或登录欧易账户,开始交易加密货币和享受平台提供的其他服务。

See all articles