您有新信

 
Re: 演算法
#1
发信站: National Sun Yet San University (m2.dj.net.tw>, 信区: BudaTech)
Heaven wrote:
> 
> Shann 兄:
> 
> > 这就是所谓 pattern matching 的想法.  我不清楚您的程式依据什麽算法写的.
> > 请找一本资料结构或演算法则的课本, 找一个称做 Knuth-Morris-Pratt 的算法.
> 
>   昨天翻了一下家中的书 :) , 果然有看到这个演算法, 但和以前一样, 还是看不懂
> :<
> 
>   不过, 那个是在一个长字串中找某一段短字串的技巧, 其实这方面我直接用 c 的函
>   数就搞定了.
> 
>   後学的重点在於, 在二个长字串中, 如何判断那些部份是相同的,
> 那些部份是不同的,
>   我想大家都懂我的意思, 不过还是举例一下:
> 
>   我爱大自然, 喜欢大自然, 您爱不爱?
>   我爱太白然, 喜欢大自然, 您爱不爱?
> 
>   写的不好的程式, 有时会看成 (我的程式就会啦!)
> 
>   我爱      大自然....
>   我爱太白然,喜欢大自然....
> 
>   这些判断如何叫电脑做呢? 有什麽好规则?
> 
>   Heaven
可以考虑用辞库来作辅助.

--
------------------------------------------------------------------------
张文明
日月工作室
voice: 886-2-658-0270 (night)
mailto: dnstudio@m2.dj.net.tw 或 wmc@mozart.seed.net.tw
电子佛教藏经阁: http://w5.dj.net.tw/~DNStudio/canon 或
http://www.tyba.org.tw/canon
Fri May 16 12:50:16 1997
回覆 | 转寄 | 返回

Re: 演算法
#2
发信站: 国立中山大学网路组 Mailing List (mail.chinatrust.com.tw>, 信区: BudaTech)
> >   我爱大自然, 喜欢大自然, 您爱不爱?
> >   我爱太白然, 喜欢大自然, 您爱不爱?
> >   写的不好的程式, 有时会看成 (我的程式就会啦!)
> >   A.我爱      大自然....
> >   B.我爱太白然,喜欢大自然....
> >   这些判断如何叫电脑做呢? 有什麽好规则?

>     再多加个判断, 将 B.中的「太白然,喜欢」当成另一列待判断的字串, 而将
>   A.中「大自」之後的「然,喜欢大自然...」与上述的「太白然,喜欢」做比较.
>     这样或许可以解决此类问题. 

  能否说详细一些, 後学不是很能弄清您的建议...

  另外, 举个黄金□例, 供大家动脑

 123456AB34甲乙EFG
 甲乙丙丁AB34甲乙EFG

标准答案:
 123456AB34甲乙EFG
 甲乙丙丁  AB34甲乙EFG

错误1:(第一行找到二个相同的就对到第二行去)
 12    3456AB34甲乙EFG
 甲乙丙丁AB34      甲乙EFG

错误2:(第二行找到二个相同的就对到第一行去)
 123456AB34甲乙        EFG
           甲乙丙丁AB34甲乙EFG

您如何要电脑去判断上面的逻辑呢?

  Heaven
Tue May 20 09:30:21 1997
回覆 | 转寄 | 返回

Re: 演算法
#3
发信站: 国立中山大学网路组 Mailing List (tpts1.seed.net.tw>, 信区: BudaTech)
Heaven wrote:
> 
>   另外, 举个黄金□例, 供大家动脑
> 
>  123456AB34甲乙EFG
>  甲乙丙丁AB34甲乙EFG
> 
> 标准答案:
>  123456AB34甲乙EFG
>  甲乙丙丁  AB34甲乙EFG
> 
> 错误1:(第一行找到二个相同的就对到第二行去)
>  12    3456AB34甲乙EFG
>  甲乙丙丁AB34      甲乙EFG
> 
> 错误2:(第二行找到二个相同的就对到第一行去)
>  123456AB34甲乙        EFG
>            甲乙丙丁AB34甲乙EF□gt; 
>
> 您如何要电脑去判断上面的逻辑呢?

好!让我这个不懂程式、不懂数学的人再来乱想一通,或
许可以激发大家的灵感。

先把这个黄金□例修改成这样:
□□□□□□□□□□□□□□□□□□□□□□□□□
字序  01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
-------------------------
A档 1 2 3 4 5 6 A B 3 4 甲 乙 E F G
B档 甲 乙 丙 丁 A B 3 4 甲 乙 E F G
□□□□□□□□□□□□□□□□□□□□□□□□□

假设每次从A档抓一个字来跟B档比,且每次都从B档的
开头第一个字比起。

A档第01个字「1」在B档找不到,记录值∞。
A档第02个字「2」在B档找不到,记录值∞。
A档第03个字「3」在B档07找到,记录值 7。
A档第04个字「4」在B档08找到,记录值 8。
A档第05个字「5」在B档找不到,记录值∞。
A档第06个字「6」在B档找不到,记录值∞。
A档第07个字「A」在B档05找到,记录值 5。
A档第08个字「B」在B档06找到,记录值 6。
A档第09个字「3」在B档07找到,记录值 7。
A档第10个字「4」在B档08找到,记录值 8。
A档第11个字「甲」在B档01、09找到,记录值 1、 9。
A档第12个字「乙」在B档02、10找到,记录值 2、10。
A档第13个字「E」在B档11找到,记录值11。
A档第14个字「F」在B档12找到,记录值12。
A档第15个字「G」在B档13找到,记录值13。

从上面的观察,当A档第11、12字各产生两个记录值时,依据前
後连续性来考量,应当取记录值9跟10。

很显然的,A档第03、04字有连续记录值7、8,其记录值总和为
7+8=15。但A档从第07到15字皆有连续记录值,且当中亦包含记
录值7、8,而其开始连续的头两个(第07、08字)记录值总和为
5+6=11。

若考虑这两个发生连续记录值的区段,第二个区段的□围不但大
於第一个区段,而且包含第一个区段,所以应当放弃第一个区段。

再从记录值总和来看,第一个区段的两个记录值总和为7+8=15,
第二个区段头两个记录值总和为 5+6=11,因为15>11,所以应该
放弃第一个区段。

□□□□□□□□□□□□□□□□□
 摩诃工作室.吴宝原
 E-mail:maha@tpts1.seed.net.tw
 Tel:(02)6741715/Fax:(02)6741716
□□□□□□□□□□□□□□□□□
Tue May 20 13:50:04 1997
回覆 | 转寄 | 返回

Re: 演算法
#4
发信站: 国立中山大学网路组 Mailing List (tpts1.seed.net.tw>, 信区: BudaTech)
Heaven wrote:
> 
>   另外, 举个黄金□例, 供大家动脑
> 
>  123456AB34甲乙EFG
>  甲乙丙丁AB34甲乙EFG
> 
> 标准答案:
>  123456AB34甲乙EFG
>  甲乙丙丁  AB34甲乙EFG
> 
> 错误1:(第一行找到二个相同的就对到第二行去)
>  12    3456AB34甲乙EFG
>  甲乙丙丁AB34      甲乙EFG
> 
> 错误2:(第二行找到二个相同的就对到第一行去)
>  123456AB34甲乙        EFG
>            甲乙丙丁AB34甲乙EF□gt; 
>
> 您如何要电脑去判断上面的逻辑呢?

好!让我这个不懂程式、不懂数学的人再来乱想一通,或
许可以激发大家的灵感。

先把这个黄金□例修改成这样:
□□□□□□□□□□□□□□□□□□□□□□□□□
字序  01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
-------------------------
A档 1 2 3 4 5 6 A B 3 4 甲 乙 E F G
B档 甲 乙 丙 丁 A B 3 4 甲 乙 E F G
□□□□□□□□□□□□□□□□□□□□□□□□□

假设每次从A档抓一个字来跟B档比,且每次都从B档的
开头第一个字比起。

A档第01个字「1」在B档找不到,记录值∞。
A档第02个字「2」在B档找不到,记录值∞。
A档第03个字「3」在B档07找到,记录值 7。
A档第04个字「4」在B档08找到,记录值 8。
A档第05个字「5」在B档找不到,记录值∞。
A档第06个字「6」在B档找不到,记录值∞。
A档第07个字「A」在B档05找到,记录值 5。
A档第08个字「B」在B档06找到,记录值 6。
A档第09个字「3」在B档07找到,记录值 7。
A档第10个字「4」在B档08找到,记录值 8。
A档第11个字「甲」在B档01、09找到,记录值 1、 9。
A档第12个字「乙」在B档02、10找到,记录值 2、10。
A档第13个字「E」在B档11找到,记录值11。
A档第14个字「F」在B档12找到,记录值12。
A档第15个字「G」在B档13找到,记录值13。

从上面的观察,当A档第11、12字各产生两个记录值时,依据前
後连续性来考量,应当取记录值9跟10。

很显然的,A档第03、04字有连续记录值7、8,其记录值总和为
7+8=15。但A档从第07到15字皆有连续记录值,且当中亦包含记
录值7、8,而其开始连续的头两个(第07、08字)记录值总和为
5+6=11。

若考虑这两个发生连续记录值的区段,第二个区段的□围不但大
於第一个区段,而且包含第一个区段,所以应当放弃第一个区段。

再从记录值总和来看,第一个区段的两个记录值总和为7+8=15,
第二个区段头两个记录值总和为 5+6=11,因为15>11,所以应该
放弃第一个区段。

□□□□□□□□□□□□□□□□□
 摩诃工作室.吴宝原
 E-mail:maha@tpts1.seed.net.tw
 Tel:(02)6741715/Fax:(02)6741716
□□□□□□□□□□□□□□□□□
Tue May 20 13:50:04 1997
回覆 | 转寄 | 返回

Re: 演算法
#5
发信站: 国立中山大学网路组 Mailing List (mail.chinatrust.com.tw>, 信区: BudaTech)
> >   我爱大自然, 喜欢大自然, 您爱不爱?
> >   我爱太白然, 喜欢大自然, 您爱不爱?
> >   写的不好的程式, 有时会看成 (我的程式就会啦!)
> >   A.我爱      大自然....
> >   B.我爱太白然,喜欢大自然....
> >   这些判断如何叫电脑做呢? 有什麽好规则?

>     再多加个判断, 将 B.中的「太白然,喜欢」当成另一列待判断的字串, 而将
>   A.中「大自」之後的「然,喜欢大自然...」与上述的「太白然,喜欢」做比较.
>     这样或许可以解决此类问题. 

  能否说详细一些, 後学不是很能弄清您的建议...

  另外, 举个黄金□例, 供大家动脑

 123456AB34甲乙EFG
 甲乙丙丁AB34甲乙EFG

标准答案:
 123456AB34甲乙EFG
 甲乙丙丁  AB34甲乙EFG

错误1:(第一行找到二个相同的就对到第二行去)
 12    3456AB34甲乙EFG
 甲乙丙丁AB34      甲乙EFG

错误2:(第二行找到二个相同的就对到第一行去)
 123456AB34甲乙        EFG
           甲乙丙丁AB34甲乙EFG

您如何要电脑去判断上面的逻辑呢?

  Heaven
Tue May 20 09:30:21 1997
回覆 | 转寄 | 返回

Re: 演算法
#6
白明弘
发信站: 狮子吼站 (Lion , 信区: BudaTech)
==> 於  ("Heaven") 文中述及:
:   能否说详细一些, 後学不是很能弄清您的建议...
:   另外, 举个黄金□例, 供大家动脑
:  123456AB34甲乙EFG
:  甲乙丙丁AB34甲乙EFG
: 标准答案:
:  123456AB34甲乙EFG
:  甲乙丙丁  AB34甲乙EFG
: 错误1:(第一行找到二个相同的就对到第二行去)
:  12    3456AB34甲乙EFG
:  甲乙丙丁AB34      甲乙EFG
: 错误2:(第二行找到二个相同的就对到第一行去)
:  123456AB34甲乙        EFG
:            甲乙丙丁AB34甲乙EFG
: 您如何要电脑去判断上面的逻辑呢?

小弟有找到两篇探讨这类问题的文章, 供师兄参考:
[1] "A File Comparison Program", by Webb Miller & Eugene W. Myers, from
    SOFTWARE-PRACTICE AND EXPERIENCE, VOL. 15(11), 1025-1040(NOVEMBER 1985)

[2] "An O(ND) Difference Algorithm and Its Variations" by Eugene W. Myers,
    from ALGORITHMICA (1986) VOL.1 pp.251-266

如果你在图书馆找不到的话, 小弟可以寄一分给你,
或是等小弟期末考完, k 他一 k, 再POST上来 ^_^
Wed Jun 18 15:05:38 1997
回覆 | 转寄 | 返回

□ 台大狮子吼佛学专站  http://buddhaspace.org