100分求助,一个负有挑战性的问题。

hello晨光 2005-10-25 10:30:44
确确的说是一个让我想破头脑的问题!:-(


命题:查找一组关键词的最短的距离
条件:
1、有一组词,存在一编文章里的不同位置。
2、这组词出现的频率没有固定。
3、这编文章存于text字段中。
具体要求:

假如这组词有两个词(张三、李四),当中“张三”可能出现15次,“李四”可能出现32次。现在要把文章中出现“张三”和“李四”最近的距离找出来

命题扩展:(完成两个词的情况下去考虑)

这组词有可能是多个,三个、四个、五个都有可能。

===========================================
号外:
分可以再加,重要的是解决问题。
我个人觉得这样的一个有挑战性的问题。
...全文
354 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
jzywh 2005-10-25
  • 打赏
  • 举报
回复

<%

function GetPos(Int0,IntL)
dim IntEnd,IntTest,IntMargin,IntLength
IntEnd = 1000000
IntMargin = 0
for i=0 to ubound(ArrWord)
IntTest = InStr(Int0+IntL,strObj,ArrWord(i))
if IntTest > 0 then
if IntTest<IntEnd then
IntMargin = IntTest-Int0-IntL
IntEnd = IntTest
IntLength = len(ArrWord(i))
end if
end if
next
if IntEnd = 1000000 then
GetPos = ""
exit function
else
GetPos = "(" & cstr(Int0) & "," & cstr(IntEnd) & "," & cstr(IntMargin) & "," & cstr(IntLength) & ")"
end if
end function

dim ArrWord,StrResult,StrObj,IntS,IntE,IntL,ArrInt,StrInt,StrFinal,i
strObj="wer张三色单峰驼retert李四sdf张三色单峰驼rete3453543543rt李四sdfwe"
ArrWord = Array("张三","李四")
StrFinal= ""
StrResult = GetPos(1,0)
do until StrResult=""
StrFinal = StrFinal & StrResult
StrInt = left(StrResult,len(StrResult)-1)
StrInt = right(StrInt,len(StrResult)-1)
ArrInt = Split(StrInt,",")
StrResult = GetPos(cint(ArrInt(1)),cint(ArrInt(3)))
loop

StrFinal = left(StrFinal,len(StrFinal)-1)
StrFinal = right(StrFinal,len(StrFinal)-1)

ArrFinal = split(StrFinal,")(")

dim x0,x1,MinLen,ArrTemp
MinLen = 1000000000
for i = 1 to ubound(ArrFinal)
ArrTemp = split(ArrFinal(i),",")
if cint(ArrTemp(2))<MinLen then
x0 = cint(ArrTemp(0))
x1 = cint(ArrTemp(1))+cint(ArrTemp(3))
MinLen = cint(ArrTemp(2))
end if
next

response.write "MinLen:" & MinLen & ",x0:" & x0 & ",x1:" & x1 & "<br>"
response.write "string:" & mid(strObj,x0,x1-x0) & "<br>"
%>
尚和空四 2005-10-25
  • 打赏
  • 举报
回复
这帖子

咱的顶
kevin_gao 2005-10-25
  • 打赏
  • 举报
回复
江大鱼两个方向都计算了。
wanghui0380 2005-10-25
  • 打赏
  • 举报
回复
呵呵,我不是说了嘛,他差了一个方向
他只计算了 张三到李四的距离 没算李四到张三距离拉
hello晨光 2005-10-25
  • 打赏
  • 举报
回复
TO jzywh(江大鱼)
有问题,你可以把你的字符串改成这样试试
"strObj="wer张三色单峰驼retert李四李四李四sdf张三色单峰驼rete3453543543rt李四sdfwe""
用你的函数试出来的结果是
“李四李四李四sdf张三色”
而按命题要求的结果应该是:
“李四sdf张三色”
kevin_gao 2005-10-25
  • 打赏
  • 举报
回复
jzywh(江大鱼)的应该是对的吧。
jingxiaoping 2005-10-25
  • 打赏
  • 举报
回复
噢,误错意思了,问一下,如何增加信誉值?非得整理FAQ吗?再问如何整理FAQ。
wanghui0380 2005-10-25
  • 打赏
  • 举报
回复
to:jingxiaoping(南无本师释迦牟尼佛)
我不是说你的算法,你的算法和我的算法在两个词上是一致的
我是说jzywh(江大鱼)的算法,没考虑方向性
jingxiaoping 2005-10-25
  • 打赏
  • 举报
回复
倒,就数学学的差。
wanghui0380 2005-10-25
  • 打赏
  • 举报
回复
呵呵,还是先换成一个数学模型来看好了
统计“张三”出现的位置 得到一串位置坐标,将这个坐标首尾相连就得到一个多边形一
统计“李四”出现的位置 得到一串位置坐标,将这个坐标首尾相连就得到一个多边形二

问题就成了,就多边形一的每个顶点到多边形二的每个顶点间距离最短的一个

如果统计的词数为n,那么将形成n个多边形,于是题目就成了求这n个多边形的顶点间距离最短的一个,这样就是一个巨大的加权有向图。

所以最终你会到,图论算法中的:广度优先,深度优先,双向广度优先的算法中
jingxiaoping 2005-10-25
  • 打赏
  • 举报
回复
不知道你说的方向性是什么意思。
wanghui0380 2005-10-25
  • 打赏
  • 举报
回复
“张三”和“李四”距离

这个是没有方向性的,楼上的只匹配了一个方向
yhfaster 2005-10-25
  • 打赏
  • 举报
回复
不会,等待,顶
jingxiaoping 2005-10-25
  • 打赏
  • 举报
回复
首先应该取得张三和李四字符出现的位置,然后存给一个数组或者是变量(需要有分隔符)
得出的值,有可能是“张三”出现2次,“李四”出现3次;
然后由出现次数多的做为外循环。
如果A数组里面存的是“张三”出现的次数,B数组里面的是“李四”出现的次数;
<%
dim b,a,i,j,dataadd,x,y
'定义变量
redim b(3)
redim a(2)
'关于B和A的数组长度(用计数器的方法可以获得)和数组值(可以利用instr()函数配合mid()函数来取得)
b(3)=14
b(2)=44
b(1)=58
a(2)=15
a(1)=99
dataadd=0 '定义最短路径变量
for i=1 to 3 '循环数组长的那组数据
for j=1 to 2
if dataadd>abs(b(i)-a(j)) or dataadd=0 then '如果最短路径变量小于两个数的差(或者最短路径变量为0)执行以下语句
dataadd=abs(b(i)-a(j)) '进行转换赋值
x=b(i) '将B和A的最短路径对应值赋给变量x和y
y=a(j)
end if
next
next
response.write dataadd '输出结果
response.write "<br>"
response.write x
response.write "<br>"
response.write y
%>
satans18 2005-10-25
  • 打赏
  • 举报
回复
不会,帮顶
jzywh 2005-10-25
  • 打赏
  • 举报
回复
<%
strObj="wer张三色单峰驼retert李四sdf张三色单峰驼rete3453543543rt李四sdfwe"
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern ="张三(.*?)李四" ' 设置模式。
regEx.IgnoreCase = True
regEx.Global = True

MinLen = 100000
MinStr = ""

Set Matches = regEx.Execute(strObj) ' 执行搜索。
For Each Match in Matches ' 对 Matches 集合进行迭代。
if len(Match.Value)<MinLen then
MinLen = len(Match.Value)
MinStr = Match.Value
end if
Next


regEx.Pattern ="李四(.*?)张三" ' 设置模式。
regEx.IgnoreCase = True
regEx.Global = True

Set Matches = regEx.Execute(strObj) ' 执行搜索。
For Each Match in Matches ' 对 Matches 集合进行迭代。
if len(Match.Value)<MinLen then
MinLen = len(Match.Value)
MinStr = Match.Value
end if
Next

Response.Write MinStr
%>
wanghui0380 2005-10-25
  • 打赏
  • 举报
回复
呵呵,图论中加权最短路径

呵呵,去找图论算法吧:广度优先算法 或深度优先算法
Gdj 2005-10-25
  • 打赏
  • 举报
回复
不论执行速度的话那就很容易了……用正则把所有词距找出来,再一个比较就搞定了。
xxgu 2005-10-25
  • 打赏
  • 举报
回复
俺不会~~~~~
帮你顶一下
hello晨光 2005-10-25
  • 打赏
  • 举报
回复
本题已经由 jzywh(江大鱼)解决,送出188分
本贴里有88分,另开一贴再送100分


===========================================
另外再开一个命题,在原命题的扩展(送388分)
http://community.csdn.net/Expert/topic/4348/4348926.xml?temp=.7808954
希望有人能拿去。
加载更多回复(8)

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧