请教个算法问题

2013-11-26 09:49:19 +08:00
 shunai
现在有2w个手机卡号,已经在Excel中,如何从这些卡号中宣传一些靓号,这些良好的规则如下:

1. 重复A的话,选出相同且相连,并包含A个数的号码,
如:AAA,那么13(444)267879、13426(777)879均能被选出

2. 如果是ABC...(字母递增,最长11位),那么宣传号码递增的号码,
如:ABCD,那么134(4567)8879、1344426(1234),均被选出


嗯,好像描述的还行,谢谢各位大大。
4468 次点击
所在节点    程序员
24 条回复
tabris17
2013-11-26 09:54:46 +08:00
算法你不是都描述出来么
megaforce
2013-11-26 09:56:19 +08:00
看这个是否可以达到你的要求:
http://www.itpub.net/thread-1801997-2-1.html
Mutoo
2013-11-26 10:11:03 +08:00
第一种情况用正则很容易构造 \d{3}
第二个情况实际上也可以构造正则,因为数量太少了
(0123)|(1234)|(2345)|(3456)|(4567)|(5678)|(6789)|(7890)
shunai
2013-11-26 10:51:02 +08:00
@Mutoo
第一种情况正则比较简单,
第二种情况,要枚举好多,因为不一定是4个递增的字母

其实需求还隐含着,AAA***DEF 这些格式
shunai
2013-11-26 10:56:43 +08:00
@megaforce

确实有相同需求,不过我需要更灵活点,类似这种格式(AAA***DEF)也能筛选
shunai
2013-11-26 10:57:29 +08:00
@tabris17

可以说是算法描述,而不是算法实现
tabris17
2013-11-26 11:01:48 +08:00
@shunai 死做呗,查找字符串内是否包含子串:
111,1111,11111,……
222,2222,22222,……
……
999,9999,99999,……
000,0000,00000,……

123、1234、12345、……
234、2345、23456、……
……
678,6789
789

2w条记录也很快就出来了
seeker
2013-11-26 13:23:18 +08:00
以前遇到过个银行卡号的正则,主要靠枚举,4000个字符不够存了,后来还增大数据库字段的长度...
alexrezit
2013-11-26 13:31:03 +08:00
你可以自己写一个算法来给每个号码的 "亮" 度打分然后排序...

(虽然我觉得毫无任何科学依据地把一些数字排列说成 "亮" 很脑残...)
shunai
2013-11-26 16:07:13 +08:00
@tabris17 2w是我大概描述的一个数据,早知道写个200w
shunai
2013-11-26 16:09:04 +08:00
@seeker 枚举好粗暴,而且即使枚举出来也不好比较,太多项了
tabris17
2013-11-26 16:09:11 +08:00
@shunai 放心吧,和你通用算法相比,这种办法耗时差不了一个数量级的
shunai
2013-11-26 16:10:06 +08:00
@alexrezit 首先要知道打分的算法
luikore
2013-11-26 17:02:29 +08:00
从靓到丑排列打印(ruby)

puts numbers.sort_by{|n|
a = (n[/(\d)\1+/] || '').size
b = n.count /01|12|23|34|45|56|67|78|89/
[a, b].max
}
luikore
2013-11-26 17:06:09 +08:00
呃, 上一帖加个 .reverse, 意思明白就好
wangyongbo
2013-11-26 17:08:20 +08:00
规则很多,用个 有限状态 自动机 ? 停止的时候,就是符合某个规则的靓号
nealnote
2013-11-26 17:37:46 +08:00
大家都在说正则。
我换个思路说,不是正则,
用 charcode
0: 48
1: 49
计算2个相邻字的code差值,相差不大于1的,不是相等就是连号。
用这个方法就不限于数字,字母也可以用。
fanzeyi
2013-11-26 18:34:47 +08:00
个人倾向于给每个手机好评定出一个分数。

手机号码每一位依次往后扫,比如这一位是 6 ,就这个号码加 2 分,然后这一位的前面有 n 个 6,那么就加 2 * n 分,等等这些规则,最后统计每个号码的分数,结果就有了。
fanzeyi
2013-11-26 18:35:14 +08:00
啊,第一句应该是「手机号」,不是「手机好」,笔误..
meta
2013-11-26 19:11:36 +08:00
好像没啥现成的办法,只能用原始的方法,把这些号码拆成单个数字,扔到一颗树里面,从根节点开始遍历。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/90632

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX