日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

离散化+unique()+二分查找

發布時間:2025/4/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 离散化+unique()+二分查找 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

離散化

引自百度百科
離散化,把無限空間中有限的個體映射到有限的空間中去,以此提高算法的時空效率。
通俗的說,離散化是在不改變數據相對大小的條件下,對數據進行相應的縮小。例如:
原數據:1,999,100000,15;處理后:1,3,4,2;
原數據:{100,200},{20,50000},{1,400};
處理后:{3,4},{2,6},{1,5};

離散化是程序設計中一個常用的技巧,它可以有效的降低時間復雜度。其基本思想就是在眾多可能的情況中,只考慮需要用的值。離散化可以改進一個低效的算法,甚至實現根本不可能實現的算法。要掌握這個思想,必須從大量的題目中理解此方法的特點。例如,在建造線段樹空間不夠的情況下,可以考慮離散化。

數據的離散化

有些數據本身很大, 自身無法作為數組的下標保存對應的屬性。如果這時只是需要這堆數據的相對屬性, 那么可以對其進行離散化處理。當數據只與它們之間的相對大小有關,而與具體是多少無關時,可以進行離散化。
例 1:
91054 與 52143的逆序對個數相同。
例 2:
設有4個數: 1234567、123456789、12345678、123456
排序:123456<1234567<12345678<123456789
=>1<2<3<4
那么這4個數可以表示成:2、4、3、1
例 3:
比如給你n個數:98998988,32434234,433234556,32434234,8384733,……
讓你統計其中每個數出現的次數,傳統的做法有好幾種,比如一遍一遍的掃過去,比對疊加,這樣算法的效率是O(n2),效率低下;
再比如先排序,再統計連續的相同的個數,這里的效率已經有所提高了,不過假如上面的數據是一道線段樹的題目給出的數據,那么建樹需要的空間開銷實在是太大了。
再改進一下,采用哈希的方法,開一個大于其中最大數的數組并初始化為零,O(n)掃一下,在該數字對應的下標的元素上+1,如果對于比較小的數字還好說,但是對于上面出現的數字直接采用哈希對空間的開銷是十分大的也是沒有必要的,所以這里用到了數據的離散化。
首先將數字排序:32434234,32434234,43324556,8384733,98998988
去重后給予其對應的索引: 0,0,1,2,3 (一一映射)
分別對應每個數,就可以簡化很多操作,減少了很多不必要的資源開銷。
除了對于較大整數需要使用離散化之外,對于一些需要使用整型數據結構,但給出的數據卻是小數的也可以使用離散化,將其索引為整數就可以了。

那么可以總結出離散化的步驟:

1、排序

2、去重

3、索引
為了簡化代碼,我們采用STL算法離散化:

/* 用離散化之前先用 sort()排序,再用 unique() 進行去重 用 lower_bound() 或者 upper_bound() 進行二分查找位置 */ int a[n], b[n], sub[n]; // a[n]是即將被離散化的數組,b[n]是a[n]的副本,sub用于排序去重后提供離散化后的值 sort(sub, sub + n); int size = unique(sub, sub + n) - sub; for(int i = 0; i < n; i++)a[i] = lower_bound(sub, sub + size, a[i]) - sub;//即a[i]為b[i]離散化后對應的值

1、unique()函數————返回值是去重之后的長度

unique() 的作用是“去掉”容器中相鄰元素的重復元素(不一定要求數組有序),即去重
它會把重復的元素添加到容器末尾(所以數組大小并沒有改變),而返回值是去重之后的尾地址
如果要刪去重復元素,可以把尾巴刪去即可(或者直接定義新的長度!)
例如:

sz=unique(b+1,b+n+1)-(b+1);//減去的(b+1) 及 a 是起始地址 sz=unique(a,a+n)-a;

2、二分查找——lower_bound()、upper_bonud()

/* upper_bound(i) 返回的是鍵值為i的元素可以插入的最后一個位置(上界) lowe_bound(i) 返回的是鍵值為i的元素可以插入的位置的第一個位置(下界)。 */

怎么理解呢,舉例:
在升序的set里面
set里沒有元素i的時候,兩個元素的返回值是一樣的。
1 2 4 5 這個序列,upp(3)和low(3)都返回位置2(下標)

如果只有一個元素i,low返回那個元素的位置,而upp返回那個元素的位置的后一個位置。
1 2 4 5 這個序列upp(2)返回下標2而low(2)返回下標1

多個元素i,low返回那個元素的位置,upp返回那多個元素中的最后一個的后一個位置。
1 2 2 4 5 這個序列 upp(2)返回下標3的位置,low(2)返回下標1的位置。

!!!!!!!!!!!!!
特別注意:舉例在一個升序的容器里,如果所有元素都大于i則,upp和low都返回begin。都小于i則返回end(越界了)。

最后再來一句,看是否好理解一些。

terator lower_bound( const key_type &key ): 返回一個迭代器,指向鍵值>= key的第一個元素。
iterator upper_bound( const key_type &key ):返回一個迭代器,指向鍵值<=key的最后一個元素的后一個元素。
★降序排列的容器:
iterator lower_bound( const key_type &key ): 返回一個迭代器,指向鍵值<= key的第一個元素。
iterator upper_bound( const key_type &key ):返回一個迭代器,指向鍵值>=key的最后一個元素的后一個元素。
例如:

bool cmp(int a,int b) {return a<b; } int main() {int a[10]={2,7,1,4,4,6};sort(a,a+6,cmp); // 去重之前先排序int m=unique(a,a+6)-a; // 去重cout<<m<<endl; // 輸出去重之后的長度for(int i=0;i<m;i++)cout<<a[i]<<' '; // 輸出去重之后的數cout<<endl;int tem=upper_bound(a,a+6,4)-a;//按從小到大 4 最多能插入數組 a 的哪個位置int p=lower_bound(a,a+6,4)-a;//按從小到大,4最少能插入數組 a 的哪個位置cout<<tem<<endl;cout<<p<<endl; }輸出 5 1 2 4 6 7 3 2

轉載于:https://www.cnblogs.com/zcy19990813/p/9702745.html

總結

以上是生活随笔為你收集整理的离散化+unique()+二分查找的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产激情精品一区二区三区 | 日日夜夜操操 | 日日躁狠狠躁 | 国产女人高潮的av毛片 | 人人草人 | 黄色大全在线观看 | 欧美日韩另类一区 | 神马久久网站 | 亚洲在线一区二区三区 | 免费在线你懂的 | 青青草免费公开视频 | 伊人久久视频 | 一区二区三区久久久久 | 免费麻豆视频 | av在观看| 人妻精品一区二区三区 | www视频在线观看免费 | 激情婷婷色 | 国产影音先锋 | 中文字幕免费视频 | 欧美激情图 | 日韩欧美亚洲成人 | 亚洲一区免费电影 | 欧美亚日韩 | 99在线精品视频 | 搡8o老女人老妇人老熟 | 色妞干网 | 九九热这里有精品 | 国产精品国产三级国产aⅴ9色 | 久久国产乱子伦精品 | 在线日韩av | 国产三级在线免费观看 | 国产精品视频在 | 嫩模一区 | 熟妇人妻av无码一区二区三区 | 亚洲毛片久久 | 国产精品一级 | 91久久精品一区 | 亚洲国产精品视频在线观看 | 欧洲精品视频在线观看 | 国产亚洲精品久久久 | 成人18视频在线观看 | 伊人激情网 | 日韩精品一区二区三区中文字幕 | 熟女av一区二区 | 成人久久视频 | 成人va视频 | 日韩不卡的av | 成人小片| 国产精品一二三区视频 | 欧美日韩国产一级 | 日韩三级一区 | 思思久久精品 | 黄色岛国片 | 日本在线免费播放 | 国产视频久久久久久久 | 亚洲4438| 免费播放片大片 | 制中文字幕音影 | 无码人妻少妇伦在线电影 | 亚洲国产婷婷香蕉久久久久久99 | 日本打白嫩屁股视频 | 今天最新中文字幕mv高清 | 丝袜淫脚 | 少妇无码吹潮 | 欧美大片91 | 欧美色综合色 | 欧洲性生活片 | 久久婷婷五月综合 | 瑟瑟视频在线看 | 在线视频97 | 四虎影视永久免费 | 国产一区二区视频免费 | 亚洲精选久久久 | 男女乱淫视频 | 免费国产黄色片 | av在线观看地址 | 抽插丰满内射高潮视频 | 鸥美一级片 | 中文字幕人妻无码系列第三区 | 国产成人无码精品久久久久 | 一区二区www| 成人3d动漫一区二区三区 | 911福利视频 | 日日噜噜夜夜狠狠久久波多野 | 草草影院最新 | 成人网免费 | 在线播放波多野结衣 | 天堂中文字幕在线观看 | 人妻射精一区二区 | 日韩久久成人 | 欧美亚洲另类视频 | 日韩美女免费视频 | 国产欧美久久久精品免费 | 国产一毛片| 色视频网址 | 人人草网站 | 西野翔之公侵犯中文字幕 | 四虎在线免费视频 |