找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 32801|回复: 6

【pbvb大杂烩】一段狠long狠long的故事,和一个算法

[复制链接]
发表于 2015-3-9 21:37:21 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
这事儿要从我读高中时说起。。。那年 人们害怕而又迫切地等待着玛雅传说中的末日的来临。那年 略显青涩的我激动万分地踏进了高中高二的大门。那年 崭新发亮的17寸宏碁显示器来到了一个中学生破旧的desk top 上。那年 。。。。咳咳 年够了。。对,当时刚接触1年vb的我在写一款字频计算程序,字频计算嘛,“abccde”一串字符,其中 a几个 b几个?好了我写了如下代码(当时的source code丢掉了,因而对我的移动硬盘的考古工作无法进行,我就大概写一些,见笑了
  1. Private Sub Command1_Click()
  2.     Dim atime As Integer
  3.     Dim btime As Integer
  4.     Dim ctime As Integer
  5.     Dim dtime As Integer
  6.     Dim etime As Integer
  7.     '......以下省略21个dim......
  8.     Dim i As Integer
  9.     For i = 1 To Len(text1.Text)
  10.         Dim s As String
  11.         s = Mid(text1.Text, i, 1)
  12.         If s = "a" Then
  13.             atime = atime + 1
  14.         End If
  15.         '......以下省略25个if闭包......
  16.     Next
  17.     MsgBox "亲,字符a出现了:" & atime & "次.出现频率为:" & atime / Len(text1.Text)
  18.     MsgBox "亲,字符b出现了:" & btime & "次.出现频率为:" & atime / Len(text1.Text)
  19.     '........以下省略24个msgbox...........
  20. End Sub
复制代码

观看过我的代码的你,一定感慨万千。。。。(啊,老C啊,你TM真傻X啊¥#@%¥#W……%(-。-;)¥&……)
嗯!不准嘲笑我的智商,起码我是一个勤奋的程序员。
好的,过了大概几个月,我又对“字频计算 v0.01进行了改进”:
  1. Private Sub Command1_Click()
  2.     Dim alphat(26) As Integer '呵呵,老C的学习能力如同沙耶,别小看我!!!
  3.     Dim i As Integer
  4.     For i = 1 To Len(text1)
  5.         alphat(Asc(id(text1, i, 1)) - 96) = UBound(Split(text1, "a"))
  6.     Next
  7.     For i = 1 To 26
  8.         text2 = text2 & "亲亲,字符a出现了:" & alphat(i) & "次.出现频率为:" & alphat(i) / Len(text1.Text) & vbCrLf
  9.     Next
  10. End Sub
复制代码

亲啊,see see !10行代码 ! 有木有!有木有!
兴奋劲儿马上过去了。。。
卧槽,计算中文字频咋办?!
咋办!什么算法能实现?好啊,又是一顿苦苦搜寻,->《21天精通vb》《vb编程宝典》《金瓶梅》《乱七八糟什么日文,还是图片,你懂的。。》
没找到!!!瞎了呀,肾费了不少,代码却没出来《=嗯嗯,和谐 和谐。
好,开始研究人类咋计算字频。
duang~弄来a4那么大一张白纸,上书“你你你我我我他aabbccX井控X藤兰”开始一个一个找:“你,1个,你,两个,你,三个”
把我数成白痴了也没想出来。。
后来后来后来再后来。我突然有了灵感!!!我数“你”,“你”就进了我的大脑,第二次发现“你”我就搜索大脑,你今天有了么?有了!
那么bingo!你+1,以此类推。。。好了捉摸出这么一套算法,我把它称为计数算法
简而言之就是建立一个数组,在目标字符串内搜索字符,没该字符,“海马体”数组+1,计数+1.好了,老C献上PB算法:
  1. 'this is aint vb its pb code!!!!!
  2. #Compile Exe
  3. #Dim All

  4. Macro Const = Macro
  5. Const MAXSIZE = 100

  6. Type ElementType
  7.     str  As WString * 1
  8.     iCtr As Integer
  9. End Type

  10. Global ArrItem() As ElementType

  11. Function PBMain () As Long
  12.     Dim ArrItem(MAXSIZE) As ElementType
  13.     Local i, j As Integer
  14.     Local str  As WString
  15.     Local s    As WString

  16.     str = "你你我我他他他aaaaaabc"

  17.     For i = 0 To MAXSIZE
  18.         ArrItem(i).str = Chr$(0)
  19.     Next

  20.     For i = 1 To Len(str)
  21.         ItemExists(Mid$(str, i, 1))
  22.     Next

  23.     j = 0: s = ""
  24.     While ArrItem(j).str <> Chr$(0) And j <= MAXSIZE
  25.         MsgBox ArrItem(j).str & ":" & Str$(ArrItem(j).iCtr)
  26.         j = j + 1
  27.     Loop
  28. End Function

  29. Sub ItemExists(ByVal it As WString)
  30.     Local i As Integer
  31.     While ArrItem(i).str <> Chr$(0) And i <= MAXSIZE
  32.         If it = ArrItem(i).str Then
  33.             ArrItem(i).iCtr = ArrItem(i).iCtr + 1
  34.             Exit Sub
  35.         End If
  36.         i = i + 1
  37.     Wend
  38.     For i = 0 To MAXSIZE
  39.         If ArrItem(i).str = Chr$(0) Then
  40.             ArrItem(i).str = it
  41.             ArrItem(i).iCtr = 1
  42.             Exit For
  43.         End If
  44.     Next
  45. End Sub
复制代码

嗯,又要和大家说再见了,那么老C会讲悲剧嘛?当然不会,皆大欢喜大结局:老C的字频计算上头条:
捕获.JPG
最后祝你。。。。。学习快乐。。。再见
此贴略水 版主鼠下留情。。
回复

使用道具 举报

 楼主| 发表于 2015-3-9 21:39:33 | 显示全部楼层
本帖最后由 cyycoish 于 2015-3-9 21:41 编辑

@0xAA55 @美俪女神 @元始天尊
回复 赞! 靠!

使用道具 举报

发表于 2015-3-9 21:44:39 | 显示全部楼层
{:soso_e127:}你居然说你能超越沙耶……
alphat(Asc(id(text1, i, 1)) - 96) = UBound(Split(text1, "a"))
这句!!呃好没节操啊!
另外你的字频计算居然上头条!哎果然百度贴吧这种黑暗的领域才是营养丰富的地方虽然确实没啥营养就是了。
回复 赞! 靠!

使用道具 举报

发表于 2015-3-9 22:03:01 | 显示全部楼层
本帖最后由 元始天尊 于 2015-3-9 22:08 编辑

看不懂vb,不错计数从算法角度来说没有难度
对于多字节码,由于码元大小不等,因此需要先GetNextCharacter ,然后返回的值作为索引++。而这一步需要做些智能处理
因此优化建议是,采用unicode码,这种码是2字节的,建立索引数组为65536即可,按2字节取码即可,效率应该达到极限
回复 赞! 靠!

使用道具 举报

发表于 2015-3-9 22:11:44 | 显示全部楼层
元始天尊 发表于 2015-3-9 22:03
看不懂vb,不错计数从算法角度来说没有难度
对于多字节码,由于码元大小不等,因此需要先GetNextCharacter  ...

事实上VB的String内部就是用UNICODE编码的,而用户在调用API之类的时候,VB会悄悄地将字符串转换为多字节然后调用,返回的字符串再转换回UNICODE,而为了优化又加入了StrPtr等玩意儿= =
回复 赞! 靠!

使用道具 举报

发表于 2015-3-9 22:17:19 | 显示全部楼层
本帖最后由 元始天尊 于 2015-3-9 22:18 编辑
0xAA55 发表于 2015-3-9 22:11
事实上VB的String内部就是用UNICODE编码的,而用户在调用API之类的时候,VB会悄悄地将字符串转换为多字节 ...


看下面写了一堆,我还以为是取ascii码,如果是unicode,就不需要麻烦的判断了,因为索引一定是0~65535的,可能4行就搞定了
int index[65536]={0};
WCHAR ptr[]=L"lichao";
for(.....)
{
        index[ptr]++;
}
回复 赞! 靠!

使用道具 举报

发表于 2015-3-9 22:37:41 | 显示全部楼层
元始天尊 发表于 2015-3-9 22:17
看下面写了一堆,我还以为是取ascii码,如果是unicode,就不需要麻烦的判断了,因为索引一定是0~65535的 ...

呃,C语言这种可以写成一行的就算了= =
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-25 00:10 , Processed in 0.040726 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表