• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    “中值排序基數法實現樹狀結構”的補充

    發布: 2007-6-30 18:56 | 作者: admin | 來源: | 查看: 12次 | 進入軟件測試論壇討論

    領測軟件測試網 “中值排序基數法實現樹狀結構”的補充

        由于一時疏忽,造成了此法“對于int類型的基數字段,對原始貼的回復只能有31個;numeric類型的基數字段,對原始貼的回復也不能超過120個”(實際上是對于int型字段,原始貼的回復第32個以上的樹狀結構顯示開始紊亂,對于numeric型的基數字段,原始貼的回復從121個以上樹狀結構顯示開始紊亂——回復并不會出問題),這是由于計算機存儲精度引起的。
        我們可以將加貼的存儲過程修改一下(加進前面加上**號的行)以限制到了一定深度(在特定數據類型下,基數無法分辨)的時候不再以樹狀結構顯示(而采用平顯——平行顯示,這樣做雖然有點象折衷的做法,但在實際上由于瀏覽器等的限制——即使在深度100的時候能以樹狀結構顯示,但從你的瀏覽器看來的樹狀結構的結果仍然不是清晰的——屏幕寬度不夠,會折行唄)。

    加貼存儲過程:

    CREATE PROCEDURE [add] @keyid int,@message varchar(50) OUTPUT  ———keyid為回復的貼子id號,如果是新貼則為0,@message為出錯信息
    AS
      IF (@keyid=0)
        INSERT INTO forum (rootid,deep,ordernum,……) values(0,0,0,……)
      ELSE
        BEGIN
         DECLARE @rootid int,@id int,@deep int,@begnum float,@endnum float,@ordernum float
         SELECT @rootid=0,@id=0,@deep=0,@begnum=0,@endnum=0,@ordernum=0
         SELECT @rootid=rootid,@id=id,@begnum=ordernum,@deep=deep from forum where id=@keyid
         IF (@id=0)
           BEGIN
            SELECT @message=‘’要回復的貼子已經被刪除!‘’
            return
           END
         ELSE
           BEGIN
            IF (@rootid=0) SELECT @rootid=@id  ——回復的是根貼,取其id為新加貼的rootid
            SELECT @endnum=ordernum where rootid=@rootid and ordernum>@begnum order by ordernum
            IF (@endnum=0)
              SELECT @ordernum=@begnum+65536   ——回復的是最后一貼,可以在此限制@ordernum的范圍以防溢出
            ELSE
    **          BEGIN
    **            IF @endnum-@begnum>1           ——精度仍能分辨。此處的1為精度標記,適合于基數字段為int,如果基數字段為numeric字段,請酌情選娶(呸呸呸,錯別字來了),目的是使基數精度過小時限制深度增加,避免顯示時的紊亂
    **              SELECT @ordernum=(@begnum+@endnum)/2,@deep=@deep+1  ——關鍵,取排序基數中值
    **            ELSE
    **              SELECT @ordernum=@begnum     ——限制深度不能再增加,此貼與回復貼平行顯示,如果存在parentid字段,則要取parentid和回復貼的parentid一樣
    **          END
    **        INSERT into forum (rootid,deep,ordernum,……) values(@rootid,@deep,@ordernum,……)
           END
        END
      Select @message=‘’成功‘’
      return

    剪枝存儲過程改為:

    CREATE PROCEDURE [del] @keyid int,@message varchar(50) OUTPUT  ———keyid為要刪除的貼子id號,如果是新貼則為0,@message為出錯信息
    AS
    DECLARE @rootid int,@id int,@deep int,@begnum float,@endnum float
    SELECT @rootid=0,@deep=0,@begnum=0,@endnum=0,@id=0
    SELECT @id=id,@begnum=ordernum,@rootid=rootid,@deep=deep from forum where id=@keyid
    IF (@id=0)
      BEGIN
       SELECT @message=‘’該貼子不存在!"
       return
      END
    ELSE
      BEGIN
       SELECT @endnum=ordernum from forum where rootid=@rootid and deep<=@deep and ordernum>@begnum order by ordernum
       IF (@endnum=0)    ——要刪除的是最后一個子枝或是根貼
         DELETE FROM forum where ordernum>=@begnum and (rootid=@rootid or id=@rootid)
       ELSE
    **     BEGIN
    **       IF @begnum=@endnum
    **         DELETE FROM forum where id=@id and (rootid=@rootid or id=@rootid) ——已經受精度限制的枝,只刪當前貼
    **       ELSE
    **         DELETE FROM forum where ordernum>=@begnum and ordernum<@endnum and (rootid=@rootid or id=@rootid)
    **     END
      END


       雖然是限制,但此限制應該是必須的,因為實際上的回復深是不能太大的(就象我在這里灌到八九層的時候,討飯貓就大叫“打住打住”了,呵呵)

       歡迎訪問我的個人主頁http://swuse.yeah.net(原來bigeagle是說我這一句話“目的明顯啊”)

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>