關於LIS和memset 函式

2021-09-25 09:17:02 字數 1179 閱讀 8749

關於最長上公升子串行問題,有兩種演算法,複雜度 o(n^2) 和 o(nlogn)

導航----紫書p274,

這一種,dp[i] = x 表示的是以i結尾的數的最長子序列是x,演算法就是從第乙個數開始遍歷,再對前面的數進行遍歷,再根據條件不斷地更新dp[i]的值。

這個演算法的主要在於內層迴圈浪費時間

memset 函式是記憶體賦值函式,用來給某一塊記憶體空間進行賦值的。

標頭檔案:cstring 或 memory

話說剛開始使用memset的時候一直以為memset是對每乙個int賦值的,心裡想有了memset還要for迴圈對陣列進行初始化幹嘛。但其實memset這個函式的作用是將數字以單個位元組逐個拷貝的方式放到指定的記憶體中去。

memset(dp,0,sizeof(dp))

int 型別的變數一般占用4個位元組,對每乙個位元組賦值0的話就變成了「00000000 00000000 000000000 00000000」 (即10進製數中的0)

memset(dp,1,sizeof(dp));

這樣你可能以為如果你賦值1的話會讓整個dp陣列裡的每乙個int變成1,其實不然。

以上**執行後,dp陣列的內容為 00000001 00000001 00000001 00000001 轉化為十進位制後不為1。

所以不能直接用memset()函式對陣列dp進行初始化!!!

優化在於使用二分,讓內層變成logn 的複雜度,可以利用lower_bound()函式,其複雜度是o(logn)。

思想:定義乙個陣列ans[i] = j; 表示長度為i時的結尾為j。初始化ans[1]=a[1];再遍歷陣列,其中,對ans陣列進行更新,如果a[i]>ans[len]的話,就長度加1,並把a[i]加入到陣列ans中,當小於的時候,其實用到了貪心的思想,選擇乙個更小的數,讓後面加入數的時候有更多的選擇,因而將小的數更新大的數。

關於memset函式

希望通過庫函式memset 來對乙個陣列進行初始化,需要了解一下該函式的工作原理。庫函式memset 是針對位元組操作的,其中第二個引數值被賦給第乙個引數指向的記憶體位址開始的每乙個位元組,因此,這種初始化其實存在侷限性,也導致其主要用於清除陣列內容等。比如 假設int a 10 i 0,1,2,m...

關於memset函式

相信很多人都知道這個函式,也都用過,但可能很多人跟我過去一樣,認為它是賦初值函式,而不知它賦初值是八位八位進行的,知道了這句話那你之後的就都懂了。首先它是在標頭檔案string.h中,這說明了什麼呢,他操作的是字元型別,而字元型別有幾位呢,那就是八位,所以它就是按八位來賦初值的。之所以我們平時可以用...

關於memset函式

void memset void s,int ch,size t n 函式解釋 將s中當前位置後面的n個位元組 typedef unsigned int size t 用ch替換並返回s。memset 作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法。mem...