學校練習,簡單的我就不放上來了,值得整理的,我儲存一下
習題41.1.驗證元素唯一性(二重迴圈)
1.1.1.演算法描述
驗證元素唯一性,主要方法是:建立兩重迴圈,進行校驗每個元素和其他元素的
1.1.2.偽**
uniqueelements(a[0..m-1])
//驗證給定陣列中的元素是否唯一
//輸入:陣列
a[0..n-1]
//輸出:如果
a中元素全部唯一,返回
true
//否則返回
false
for i<- 0 to n-2 do
for j<- i+1 to n-1 do
if a[i]=a[j] return false
return true
1.1.3.演算法實現
bool uniqueelements(int ele,int len)
2.1.演算法優化(quick sort 優化)
2.1.1.演算法描述
使用quick sort排序演算法進行優化,主要方法是:使用
quick sort
演算法,進行元素排序,再取第乙個值。
2.1.2驗證元素唯一性
(quick sort
優化,偽**
)uniqueelements(a[0..m-1]
//驗證給定陣列中元素是否唯一
//輸入:陣列
a[0..n-1]
//輸出:如果
a中元素全部唯一,返回
true
//否則返回
false
qsort(a)
for i<-0 to len-1 do
if a[i]=a[i+1] return false
return true
2.1.3改進演算法實現
int cmp(const void *a,const void *b)
bool uniqueelements(int ele,int len)
3.1.快排演算法(quick sort)
3.1.1.演算法描述
快排演算法,是對氣泡排序的一種改進,在其中,有著分冶的思想。我們取乙個base,之後進行左右遞迴排序。在排序過程中,我們從右往左,找到剛好比
base
小的數字,將右值賦給左值,然後從左往右,找到剛好比
base
大的數字,將左值給右值,最後兩值相等,我們將
base
給左值。
3.1.2.偽**
get_base(ele[0,m-1],left,right)
//獲取劃分的目標
//輸入
:乙個元素,給定乙個左值右值作為區間
//輸出
:返回劃分的索引
base<-ele[left]
while leftwhile left= base do
right--
endwhile leftleft++
endele[left]=base
endreturn left;
quick_sort(ele[0,m-1],left,right)
//進行遞迴排序
//輸入
:乙個元素,給定乙個左值右值作為區間
if leftindex<-getbase(ele,left,right)
quick_sort(ele,left,right)
quick_sort(ele,left,right)
end3.1.3.實現
int get_base(int ele,int left,int right)
ele[left]=base;
return left;
}void quick_sort(int ele,int left,int right)
}4.1.試驗小結
在驗證元素唯一性的時候,我們通常的做法是,進行兩重迴圈,進行兩兩相比較,如果兩兩相同,則返回false,否則返回
true
,這種演算法,時間複雜度為
o(n^2)
,空間複雜度為
o(1)
,所以我們想到了優化方案,使用快排,進行優化,之後依次進行遍歷,即可得到。我們思考一下,在使用快排,我們的時間複雜度為
o(nlogn)
,空間複雜度為
o(1)
。這個效率明顯比之前的效率優化了太多。
快排演算法中,我們可以使用c語言
中自帶的
qsort
函式,這個函式的原型如下,
void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );
第乙個buf
,指的是你的陣列,第二個引數
size_t
指的是乙個無符號整型,為你的陣列長度,第三個引數為你的陣列元素大小,第四個引數為乙個
void
指標,我們在
c程式的學習中,知道了,
void
指標可以指向任意,也可以被任意所指向,所以,我們在定義比較函式
cmp的時候,要注意,定義的是
const void*
的引數型別,之後再強轉為元素指標型別,進行比較,這樣做,能直接將快排演算法,適用於整個
c程式中任意排序。
在手寫快速排序的時候,我們要注意一點,關於左右值的移動,應該先移動右值,賦值給左,然後再移動左,賦值給右,最後,返回左下標,作為劃分點。
我們在了解劃分的時候,不能夠忘記乙個思想,分冶的思想,這個思想在我們今後會經常能夠用得到。
驗證唯一性的不足
唯一性驗證無法真正保證唯一性。validates email,presence true,format uniqueness 不會吧,出了問題呢?下面我來解釋一下。alice 用 alice wonderland.com 註冊 alice 不小心按了兩次提交按鈕,連續傳送了兩次請求 然後就會發生下面...
Set集合元素的唯一性
hashset實現 set 介面,所以hashset保證元素唯一性的做法與set的做法一致,下面用hashset為例子來說明set集合是如何確保元素的唯一性的。public static void main string args 輸出的結果為 1,2,3 從上面這段 可以看到,這裡往integer...
HashSet如何保證元素的唯一性
底層資料結構是雜湊表 元素是鍊錶的陣列 也就是說,保證元素的唯一性的第一層保證就是元素的hashcode。下面我們從原始碼的角度來分析 當我們向hashset中插入乙個元素的時候,發生了什麼。public hashset 這裡hashset的構造函式呼叫了hashmap,public class h...