惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
小众软件
小众软件
The Cloudflare Blog
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
S
SegmentFault 最新的问题
宝玉的分享
宝玉的分享
博客园 - 叶小钗
月光博客
月光博客
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
Y
Y Combinator Blog
D
Docker
Microsoft Azure Blog
Microsoft Azure Blog

kok的笔记本

macOS 里 神秘的 kernel_task ,为什么一直在写入硬盘? 产品 node_modules 为什么总是这么大:一次从原理到实践的瘦身记录 谁来救救我的Mac存储空间-清理工具横评:付费vs免费,从界面到命令行 2023 读书推荐 写给播客嘉宾的录制说明书 在 Electron 中使用 Vue Devtools 几何原本中勾股定理的证明 Mac 安装软件时提示 已损坏,无法打开 应该怎么办 PegBoard 你的数字白板 少数派读者与作者的 NewsLetter 闲棋冷子-2-2021年我读过哪些很棒的书 闲棋冷子-1-相信你的身体,它不会骗你 修复 macOS 中 Cisco Anyconnect 报的奇怪Bug 我的 NAS 使用记录 Omniplan 入门教程 Hugo升级0.74记录 一年级产品经理需要掌握什么知识? 无籍之谈-3-和盖盖聊聊尼尔·盖曼与中外科幻 露营笔记-装备篇 无籍之谈-2-和鹏仔聊华尔街兴盛史,给小白投资者的一些建议 介绍一下《无籍之谈》 无籍之谈-1-和不土聊佛学,谈谈《一心走路》《僧侣与哲学家》 高达模型入门 - 工具整理 5 分钟了解 Sketch 的新特性 Tint - 色调 Hugo 主题移动端开发的一些心得 修复 macbook 键盘连击问题 在 Hugo 中使用 Open Graph 提升分享效果 选小米10 还是小米10 Pro? 利用 Python 批量合并 Excel 文件
用一个特殊方法解决同位词问题
kokdemo · 2014-05-04 · via kok的笔记本

前几天参加某公司的面试,被问了这么一个问题:

有一个字符串组叫a, a = [a, abc, apple, …, zoo]。 其中像stop post tops 这样的就叫做同位词。

这么看来同位词也就是组成相同,长短一样的两个字符串。

我事后查了一下,这个题是编程珠玑上的一道题目,书上给出的方案是这样的。

先将字符串内部按顺序排列,比如bac->abc,然后字符串间在排序,就可以找到同位词。

我当时给出的答案却是这样的:

对a,b,c~z进行加权,让a=1,b=2,c=4~z=2^25,然后每个字符串就可以算出来唯一的特征值。

后来给面试官解释这个原理的时候说的不是很好,于是自己后来想了一下,觉得这个思路还是可以发展一下的。

###为什么要这么定权值?

对于2^n的这个序列,很明显相邻两个数之间的差值为2^x,x为相邻两个数之间的较小值。

假设存在一个式子:

2^a+2^b=2^c+2^d      其中a,b,c,d互不相等。

这里让a>d,c>b,对这个式子做一个变化。

2^a-2^d=2^c-2^b

由刚才的推论我们知道,等号左边或者右边的结果,一定至少是2^x这个格式,或者是2^x1+2^x2……。

式中x取式中较小值,这里让x分别取d和b。得到

2^d=2^b

这明显与假设不符(就算让他们展开为x1+x2这种也不符),因此可以得到一个结论。

在2^n的序列中,不存在 2^a+2^b=2^c+2^d。

也就是说,我将a,b,c赋2^n的权值,不会存在a+b=c的情况,也不会存在a+b=c+d的情况,这对于我们标记一个独特的字符串十分有用。

当然你可能会说a+a=b,但是计算权值是有前提的,就是字符串要等长,这样这个问题就可以规避掉了。

###当然这个方法也是有问题的!! 细心的你估计马上就发现了,英文字母有26个,那么光计算z的权值就要2^25= 33554432 ,略大啊……如果有一个字符串是“zzzzzzz”,那还能不能愉快的计算了……

为了减少计算压力,我有这么几个方案:

  1. 将字母表中的前八位改为2^-8~2^0,计算的时候,先把小数点后提取出来,同时计算小数点后的权值和整数部分权值。

    至于为啥是前八位,因为2^-8=0.00390625,小数点后已经有八位了……你看之前2的25次方也才八位数而已,当然这个方案也只是一个试想……

  2. 其实2^n不就是指一个二进制数么!

    比如abc,按照之前的方案,其实就是111,ac就是101,这个值也是唯一的,那么我们完全可以把所有的字符串改为存储这样的数字啊!

    比如有abc和bca,他们的权都是111,两者and一下,如果是1,那就是同位词,如果不是那妥妥的就不是了。当然这个法子的前提依旧是等长,不然的话aaac就等于abc了……

仔细的想了一下,编程珠玑上用来给每个字符串求特征序列,在进行排序的思路和我的思路本质上是一样的!

因为究其根本,还是把一个乱序转化为一个特征,只不过它需要先内部排序,再外部比较,我的方案在内部排序的时候速度更快一些,一轮循环就可以结束。在空间占用上,两个方案差不多。

今天分享了一个好玩的题目,我感觉是蛮有意思的,也感谢你的阅读。