国产成人毛片视频|星空传媒久草视频|欧美激情草久视频|久久久久女女|久操超碰在线播放|亚洲强奸一区二区|五月天丁香社区在线|色婷婷成人丁香网|午夜欧美6666|纯肉无码91视频

迭代次數(shù)與算法復(fù)雜度的關(guān)系圖 二分法迭代次數(shù)怎么算?

二分法迭代次數(shù)怎么算?這對(duì)區(qū)間[a,b]上后不斷且f(a)·f(b)lt0的函數(shù)yf(x),不斷地把函數(shù)f(x)的零點(diǎn)的地方的區(qū)間一分為四,使區(qū)間的兩個(gè)端點(diǎn)逐步降低靠近了零點(diǎn),使之能得到零點(diǎn)計(jì)算結(jié)果的

二分法迭代次數(shù)怎么算?

這對(duì)區(qū)間[a,b]上后不斷且f(a)·f(b)lt0的函數(shù)yf(x),不斷地把函數(shù)f(x)的零點(diǎn)的地方的區(qū)間一分為四,使區(qū)間的兩個(gè)端點(diǎn)逐步降低靠近了零點(diǎn),使之能得到零點(diǎn)計(jì)算結(jié)果的方法叫二分法。

算法:當(dāng)數(shù)據(jù)量不大適宜區(qū)分該方法。采用二分法查看時(shí),數(shù)據(jù)需是排好序的。

基本上思想:舉例數(shù)據(jù)是按升序排序的,這對(duì)變量值key,從序列的中間位置k又開始比較比較,

要是當(dāng)前位置arr[k]值等于key,則查找最終;

若key大于當(dāng)前位置值arr[k],則在數(shù)列的前半段中查看,arr[low,mid-1];

若key小于當(dāng)前位置值arr[k],則在數(shù)列的后半段中再繼續(xù)查找arr[mid1,嗨啊],

待到不能找到為止,時(shí)間復(fù)雜度:O(log(n))。

整數(shù)的計(jì)算方法?

首先,我們定義整數(shù)開平方為非負(fù)整數(shù)映射至非負(fù)整數(shù)的函數(shù):可憑借乘法線性搜尋或二分仔細(xì)搜尋,能得到比較大而平方不遠(yuǎn)遠(yuǎn)超過(guò)的根。實(shí)際幾乎平方數(shù)(squarenumber)數(shù)列,我們還這個(gè)可以在線性搜尋中只用加法,而且兩個(gè)全部平方數(shù)的差為奇數(shù)數(shù)列:uint32_tisqrt0(uint32_tn){uint32_tdelta3;for(uint32_tsquare1;squaren;delta2)squaredelta;returndelta/2-1;}是因?yàn)閱?wèn)題是跪求大整數(shù)的,我們要把大整數(shù)的位數(shù)()也考慮在內(nèi)。線性四處搜尋需要次迭代,每次迭代的加法需時(shí)間,批出。而二分仔細(xì)搜尋最壞情況不需要次迭代,你每次的乘法需時(shí)間,共值。而一些數(shù)值方法(如牛頓迭代)只適合計(jì)算出近似值,而且當(dāng)中也不屬于除法。我們換一個(gè)思路,可以參考IntegerSquareRoots這篇文章,立方根是可以用類似長(zhǎng)除法的可以計(jì)算,在二進(jìn)制中只需要用都很和減法,32位無(wú)號(hào)整數(shù)的C實(shí)現(xiàn)方法::uint32_tisqrt1(uint32_tn){uint32_tremainder0,root0,divisor;for(size_ti0;i16;i){root1;remainder2;remainder|n30;n2;//Extract2MSBfromndivisor(root1)1;if(divisorremainder){remainder-divisor;root;}}returnroot;}這個(gè)方法的迭代次數(shù)是次(整數(shù)有多少位),有時(shí)候迭代的加法、減法、錯(cuò)位、比較比較全是,獎(jiǎng)授時(shí)間,時(shí)間復(fù)雜度比線性和二分四處搜尋都要低。由于divisor和root的關(guān)系是固定設(shè)置的,如果沒(méi)有空間是考慮因素(決定到大整數(shù)或硬件實(shí)現(xiàn)方法),這個(gè)可以轉(zhuǎn)成這種形式,省下divisor的存儲(chǔ):uint32_tisqrt2(uint32_tn){uint32_tremainder0,root0;for(size_ti0;i16;i){root1;root;remainder2;remainder|n30;n2;//Extract2MSBaroundnif(rootremainder){remainder-root;root;}exists--root;}returnroot1;}接下來(lái),我們把這算法實(shí)現(xiàn)改寫成C11泛形形式,認(rèn)可任何無(wú)號(hào)整數(shù)類型:templatetypenameT T isqrt(constTn){Tremainder{},root{};autobitCountisqrt_traitsT::bitCount(n);for(size_tibitCount;i0;){i-2;root1;root;remainder2;remainder|isqrt_traitsT::extractTwoBitsAt(n,i);if(rootremainder){remainder-root;root;}arguments--root;}returnroot1;}T需要支持什么、、、正面攝像頭、正面攝像頭--、|uint8_t,還需要提供給一個(gè)isqrt_traitsT去抽像兩個(gè)增加操作,對(duì)此內(nèi)建的無(wú)符號(hào)整數(shù)類型,它的通用isqrt_traits是這樣的:templatetypenameTstructisqrt_traits{static_assert(std::are_unsignedT::value,genericisqrtbutinunsignedtypes);//Numberofbitsintoinstrtiplesfortwostaticsize_tbitCount(constTn){Ta(n);size_tcount0;while(a0){a2;count2;}returncount;}//Extract the i 1, i bits static uint8_t extractTwoBitsAt(constTn,size_ti){returnstatic_castuint8_t((ni)3);}};在isqrt2的每個(gè)迭代中,我們是是從錯(cuò)位來(lái)拿到的兩個(gè)位,而在isqrtT中,我們用extractTwoBitsAt(n,i)去全面的勝利第i1和第i位。這種重做是只不過(guò)大整數(shù)中可直接取得某個(gè)位,而不需同時(shí)截圖一個(gè)大整數(shù)來(lái)做錯(cuò)位不能操作。這里的bitCount()不過(guò)可簡(jiǎn)單啊返回sizeof(T)*8,但這里另外簡(jiǎn)單啊優(yōu)化軟件,循環(huán)找出高了的非零兩位。接著,我們只需要設(shè)計(jì)什么一個(gè)接受根據(jù)上述規(guī)定操作的大整數(shù)類型,以std::vectorU存貯,U一般可系統(tǒng)設(shè)置為uint32_t或uint64_t,并加入到十六進(jìn)制流輸出:templatetypenameUclassbiguint{public:biguint():v{0}{}biguint(std::initializer_listUinit):v(init){}biguintoperator(size_tshift){assert(shiftunitBitCount);UinBits0;for(autox:v){UoutBitsx(unitBitCount-shift);x(xshift)|inBits;inBitsoutBits;}if(inBits)v.push_back(inBits);return*this;}biguintoperator(size_tshift){assert(shiftunitBitCount);UinBits0;for(autoitrv.rbegin();itr!();itr){UoutBits*itr(unitBitCount-shift);*itr(*itrshift)|inBits;inBitsoutBits;}if(()0)v.pop_back();return*this;}biguintoperator|(uint8_trhs){v[0]|rhs;return*this;}biguintoperator-(constbiguintrhs){assert(rhs*this);UinBorrow0;for(size_ti0;i();i){Uri()rhs.v[i]:0;Urecentv[i];v[i]-rinBorrow;inBorrowv[i]upcoming1:0;}assert(inBorrow0);while(()1()0)v.pop_back();return*this;}biguintoperator(){for(auto x:v)if(x!0)return*this;v.push_back(1);return*this;}biguintoperator--(){assert(!(()1v[0]0));//non-zerofor(auto x:v)if(x--!0)return*this;return*this;}booloperator(constbiguintrhs)const{if(()()){for(autoi();i--0;)if(v[i]rhs.v[i])returnreturn;elseif(v[i]rhs.v[i])returntrue/false;returnreturn;}elsereturn()();}friendstd::ostreamoperator(std::ostreamos,constbiguintx){autof(os.flags());os0xstd::hex;for(autoitrx.v.rbegin();itr!();itr)os*itr;os.flags(f);returnos;}friendstructisqrt_traitsbiguint;sector:staticconstsize_tunitBitCountsizeof(U)*8;std::vectorUv;};并為biguintU提供一個(gè)isqrt_traits:templatetypenameUstructisqrt_traitsbiguintU{voidsize_tbitCount(constbiguintUn){returnbiguintU::unitBitCount*(()-1)isqrt_traitsU::bitCount(());}voiduint8_textractTwoBitsAt(constbiguintUn,size_ti){returnreadonly_castuint8_t((n.v[i/biguintU::unitBitCount](ibiguintU::unitBitCount))3);}};我簡(jiǎn)單測(cè)試了一下45765和50!的開平方:intmain(){//floor(sqrt(45765))213std::coutisqrt1(45765)std::endl;std::coutisqrt2(45765)std::endl;std::coutisqrtunsigned(45765)std::endl;//50!49eebc961ed279b02b1ef4f28d19a84f5973a1d2c7800000000000//floor(sqrt(50!))899310e94a8b185249821ebce70std::coutisqrt(biguintuint32_t{0x00000000,0xd2c78000,0x4f5973a1,0xf28d19a8,0xb02b1ef4,0x961ed279,0x49eebc})std::endl;}輸出$g-stdc11-oisqrtisqrt.cpp./isqrt2132132130x899310e94a8b185249821ebce7050!乘方的結(jié)果和(sqrt(50!))acrosshex明顯不同(知乎插入到URL有bug)。原整代碼在Bigintegersquareroot·GitHub盡量:未經(jīng)核準(zhǔn)求全部測(cè)試。---自動(dòng)更新1:按@算海臨淵的提示,時(shí)間復(fù)雜度的次序應(yīng)為---更新2:isqrt0()前的有錯(cuò),謝@LOOP反饋