让高手教你们一个快速方法吧!'data:一组排好序的数
'findnum:要找的数
'返回值:要找的数在data数组中的索引值,如果没有则返回-1
Private Function fastfind(data() As Long, findnum As Long) As Long
Dim a() As Long, datalb As Long, dataub As Long, tmp As Long, tmp2 As LogEventTypeConstants
datalb = LBound(data)
dataub = UBound(data)
tmp2 = datalbReDim a(data(datalb) To data(dataub))For tmp = datalb To dataub
a(data(tmp)) = tmp2
tmp2 = tmp2 + 1
NextIf data(a(findnum)) = findnum Then
fastfind = a(findnum)
Else
fastfind = -1
End If
End Function
'调用例
Private Sub Form_Load()
Dim a(10) As Long
a(0) = 3
a(1) = 6
a(2) = 7
a(3) = 22
a(4) = 43
a(5) = 44
a(6) = 48
a(7) = 76
a(8) = 244
a(9) = 255
a(10) = 292Debug.Print fastfind(a, 48)End Sub
以上方法完全不用if语句判断大小,比二分法要快得多!!!

解决方案 »

  1.   

    奇怪,tmp2怎么 as LogEventTypeConstants???
    应该是tmp2 as long
      

  2.   

    to : fq1() 
      你那个算法有名字吗?
      

  3.   

    to iris_xyz(iris):
    我是根据算术排序法改编的。这个方法是最快的!比任何基于比较的算法都快!!!
    因为它把比较所用的CPU时间转换成了内存占用!
      

  4.   

    to nik_Amis(Azrael):
    可以,批准了!
    试完了把试验代码和结果贴上来,我也看看到底有多快!我又改进了一下代码,你用这个试!'data:一组排好序的数,升序降序都行
    'findnum:要找的数
    'retindex:返回要找的数在data数组中的索引值
    '返回值:如果要找的数在data数组中存在返回true,否则返回flase
    Private Function fastfind(data() As Long, findnum As Long, retindex As Long) As Boolean
    Dim a() As Long, datalb As Long, dataub As Long, tmp As Long, tmp2 As Long, stp As Long
    datalb = LBound(data)
    dataub = UBound(data)If data(datalb) > data(dataub) Then
    stp = -1
    datalb = tmp
    datalb = dataub
    dataub = tmp
    Else
    stp = 1
    End If
    tmp2 = datalbReDim a(data(datalb) To data(dataub))For tmp = datalb To dataub Step stp
    a(data(tmp)) = tmp2
    tmp2 = tmp2 + stp
    NextIf data(a(findnum)) = findnum Then
    retindex = a(findnum)
    fastfind = True
    End If
    End Function
    '调用例
    Private Sub Form_Load()
    Dim a(10) As Long
    a(0) = 292
    a(1) = 255
    a(2) = 244
    a(3) = 181
    a(4) = 97
    a(5) = 48
    a(6) = 43
    a(7) = 28
    a(8) = 7
    a(9) = 6
    a(10) = 3
    Dim ret As Long
    Debug.Print fastfind(a, 8, ret)
    Debug.Print fastfind(a, 28, ret)
    Debug.Print ret
    End Sub
      

  5.   

    to所有认为二分法最快的人:
    你们的知识还是太少了,学个二分法就认为它是最快的!
    其实二分法是使用比较法作为算法基础的算法中最快的,它需要N * log(N)的时间。但在计算机上还有更快的方法来算,就是突破传统的使用比较法来算的方法,用空间(即内存)来代替时间(即计算时间),我的那种计数法!它只需要N的时间就可以完成!!
      

  6.   

    再次修正!'data:一组排好序的数,升序降序都行
    'findnum:要找的数
    'retindex:返回要找的数在data数组中的索引值
    '返回值:如果要找的数在data数组中存在返回true,否则返回flase
    Private Function fastfind(data() As Long, findnum As Long, retindex As Long) As Boolean
    Dim a() As Long, datalb As Long, dataub As Long, tmp As Long, tmp2 As Long, stp As Long
    'On Error GoTo Errdatalb = LBound(data)
    dataub = UBound(data)If data(datalb) > data(dataub) Then
    stp = -1
    datalb = tmp
    datalb = dataub
    dataub = tmp
    Else
    stp = 1
    End If
    tmp2 = datalbReDim a(data(datalb) To data(dataub))'Witten by FQ!For tmp = datalb To dataub Step stp
    a(data(tmp)) = tmp2
    tmp2 = tmp2 + stp
    NextIf data(a(findnum)) = findnum Then
    retindex = a(findnum)
    fastfind = True
    End If
    Err:
    End Function
    '调用例
    Private Sub Form_Load()
    Dim a(10) As Long
    a(0) = 292
    a(1) = 255
    a(2) = 244
    a(3) = 181
    a(4) = 97
    a(5) = 48
    a(6) = 43
    a(7) = 28
    a(8) = 7
    a(9) = 6
    a(10) = 3
    Dim ret As Long
    Debug.Print fastfind(a, 4448, ret)
    Debug.Print fastfind(a, 28, ret)
    Debug.Print ret
    End Sub
      

  7.   

    再次修正!!
    'data:一组排好序的数,升序降序都行
    'findnum:要找的数
    'retindex:返回要找的数在data数组中的索引值
    '返回值:如果要找的数在data数组中存在返回true,否则返回flase
    Private Function fastfind(data() As Long, findnum As Long, retindex As Long) As Boolean
    Dim a() As Long, datalb As Long, dataub As Long, tmp As Long, tmp2 As Long, stp As Long
    On Error GoTo Errdatalb = LBound(data)
    dataub = UBound(data)If data(datalb) > data(dataub) Then
    stp = -1
    datalb = tmp
    datalb = dataub
    dataub = tmp
    Else
    stp = 1
    End If
    tmp2 = datalbReDim a(data(datalb) To data(dataub))For tmp = datalb To dataub Step stp
    a(data(tmp)) = tmp2
    tmp2 = tmp2 + stp
    NextIf data(a(findnum)) = findnum Then
    retindex = a(findnum)
    fastfind = True
    End If
    Err:
    End Function
    '调用例
    Private Sub Form_Load()
    Dim a(10) As Long
    a(0) = 292
    a(1) = 255
    a(2) = 244
    a(3) = 181
    a(4) = 97
    a(5) = 48
    a(6) = 43
    a(7) = 28
    a(8) = 7
    a(9) = 6
    a(10) = 3
    Dim ret As Long
    Debug.Print fastfind(a, 4448, ret)
    Debug.Print fastfind(a, 28, ret)
    Debug.Print ret
    End Sub
      

  8.   

    to nik_Amis(Azrael):
    枉你徒有五个三角,你就那点气量?
    你这样的白痴这辈子也好不到哪儿去!
    你他妈才去死呢!!!
      

  9.   

    fq1() 
    你很牛啊
    Bill Gates见了你都的管你叫大叔
    因为你会一个什么算书法啊~~~~~~我们是孤陋寡闻
    我们是不会你那个了不起的算书法
    我们就他妈的认准了二分法了对不起我骂人了
    我除了骂日本人和你以外,没有说过脏话
    本来一个新的思路,被你这种人一说,一点味道都没有了~~~~~
    我五个角怎么了?
    你五个角也不过如此啊
    就是看不惯你这种人~~~~~~
    会个算术法就不知东西南北了
    懒的和你她妈的废话了~~~~~
      

  10.   

    nik_Amis(Azrael)
    你老子我就是很牛!
    你不也直管我叫老大吗?
    我会的东西多了,但你这样的傻B是理解不了的!!少用我们这个词,你不是人大代表!这里的人并不都象你这头猪一样!就说你自己吧!
    你不仅孤陋寡闻,还很笨!这是你自己承认的:"我很笨啊~~~~~"
    这种算法满地都是,你说他了不起,只能说明你是多么的低能!
    你就他妈的认准了二分法了?分你妈吧!!!不用对不起,老子骂你就不说对不起,因为
    我除了骂过一条狗之外,没有说过脏话,骂狗是不用对不起的!
    本来好好的一个算法讨论,被你这种嫉妒加红眼的心理变态一搅和,一点味道都没有了~~~~~
    你这样的五个角只能说你是欺世盗名,徒有虚表!
    我的五个角是通过我的努力,大家看得起给我的!至少到现在,只有我贴出了算法代码!
    你看不惯我这种人,是因为你有心理疾病!每个正常的普通人都知道以宽容的心态对待别人的行为!
    我从来没有不知东西南北,我只是说出我的观点。既然大家在讨论,那么每个人都有权利畅所欲言!是你的心理疾病使你误认为我不知东西南北了。
    "Bill Gates见了你都的管你叫大叔" <-- 像你这样的语无伦次,还是闭嘴的好,免得惹人耻笑!你懒得对我说废话了,总算你有些自知之明!
      

  11.   

    我骂得你很低俗,不用生气,免得伤身体!
    我来给你分清事理,这样骂你的原因在哪儿。首先,在这里第一个骂人的是你:"真他妈的受不了你!去死"。是可忍,孰不可忍!
    你既然骂我,那我就骂还你!第二,你在一开始就表现出了某种心理问题:
    fq1() 
    我很笨啊~~~~~我就是想看看这两个算法
    占用时间的比例,可以么?老大????
    你用自嘲的口气说出的这段文字,清楚地透漏出你贬损我和这个算法的内心思想。
    也许是我在前面的话:"用不着试,稍微聪明点的人就能看出来它肯定比其他算法快!"激怒了你,如果这样,只能说明你心理承受能力低。我之所以对你说出这句稍有攻击性话,实在是因为代码清清楚楚贴在那儿,你难道没有看见在最关键的循环中没有条件转移语句吗?要知道现代CPU运算中最浪费时间的就是分枝转移,不仅流水线被冲洗,而且本身就会耽搁好几个时钟周期。所以现在的新CPU都有动态分枝预测技术,来尽量避免这种损失。如果能在循环中去掉条件转移,就可以极大地提高速度。
    因为一个加减法只需一个时钟周期,而且是UV类指令可以在双流水线CPU上一次执行两个。我觉得你既然五个角应该知道这些,所以当你说出与你身份不相称的话来时,我用了稍有攻击性的语言。没别的意思,只是想提醒你看清楚代码。没想到你似乎对这句话的反应很大,紧接着就说自己很笨,还叫我老大。我觉得你这样做实在很不好,大家都是五个角,有什么话直说不行吗?何必用这种阴损的语言即贬低自己,又损别人呢?你既然不尊重自己,那我就支持你。所以下面我说:"可以,批准了"等,实际还是有玩笑的语气在里面,希望就此息事宁人。我想,你是五个角,也算是水平不低,不应该气量那么小,可谁知,你那狭隘的心理受不了了,爆发了,开始骂我!综上,这次事件完全因你心理承受能力低而引起。虽然你骂我,但在这里,作为同行,我还是要给你些建议,你应该去看看心理医生,真的,你这种心理长期下去是不行的,总有一天会收到苦果。你在这儿骂我行,但当某天你得罪了一个有权有势的人,你可就吃不了兜着走了!
    我不会再回应你的话了,我不想和一个心理有问题的人骂什么架。
    你还愿意在这儿表演拙劣的骂街你就表演吧,没人理你的!
    徒让大家看笑话,没意思!
      

  12.   

    wang_anjun(大笨猫):
    数之间跨距很大时查找速度并不受影响,它只循环数组中元素的个数次。
    以(1,3,5,200,100000000)来说,就循环五次。
    数之间跨距很大唯一影响的就是需要很多内存,因为这个算法就是用内存换时间。Calf():
    小数的话用我这个算法可以考虑先转成整数再找。
      

  13.   

    fq1() 
    我的承认你骂人的本事和你的那个算法一样厉害但是,我为什么骂你?
    从你的言语间,看得出你是个非常狂妄自大的人
    从你的地一句话
    "让高手教你们一个快速方法吧!"
    虽然有点开玩笑的意思,但是本质是你蔑视别人我说:
    ??做过测试么??
    今晚我回家试试比例我没有仔细研究你的方法
    比例是最直观的,我只是希望你如果能提供一个比例,要不然我自己回家试试
    研究效率不就是为了看看速度到底有多快么?
    我想要的是比例,而不是谁快我在说挑衅性的话么?你却说:
    楼上:
    用不着试,稍微聪明点的人就能看出来它肯定比其他算法快!你不明白的话去学学各种排序算法,找找其中的算术排序法!!!你首先就没有理解我的意思
    你不说话则以,一说话就时带这一种侮辱性的口气
    大家来这里都是学习和交流的
    就算我们没你明白,你需要用这种口气么??
    我们来这里不是受你侮辱的!!
    是谁先挑起事端?你为什么可以张口就侮辱别人?是你心里有问题
    你蔑视别人,你狂妄的字眼比比皆是
    你是一个极度以自我为中心的人
    谁和你在一起都不会好受,你周围的人都要忍受你么?我说
    fq1() 
    我很笨啊~~~~~我就是想看看这两个算法
    占用时间的比例,可以么?老大????我的意思是你没必要那么狂妄吧?
    你接下来的话还是侮辱性的
    对于你我实在忍无可忍
    你如果正正长长的说话,我会骂你么?你可以认为别人受了你的侮辱,可以一笑了之
    那我骂你侮辱你,你为什么不能一笑了之?
    到底谁狭隘?至于你最后说的什么骂街..
    很遗憾,我没有兴趣最后,我的五个角为什么就是"欺世盗名,徒有虚表"??
    因为我和你争论了几句,骂了你几句?
    你就宣布我的五个角就是"欺世盗名,徒有虚表"??
    那你骂的话比我的更难听,你不是更...
    我的角都是回答问题的来的,看看有的帖子,得分的是我,不是你
    作为同行,劝告你一句
    谁都不是圣人,谁都有长处有短处
    不要太狂妄,就算你自己比别人都厉害
    你也没有必要侮辱别人!
      

  14.   

    唉,真没有办法,又开始了,难道逼着我结贴?二分法和fql()的方法我都试过,都挺好,我在这发贴一方面是寻求好的方法,另一方面是希望大家做个交流,因为有人跟我说有很多很好的方法,但我都不知道,所以发贴。没想到会这样!!我看二位还是算了,我不想让我这个帖子惹得大家这么不开心!!