驗證元素的唯一性(二重迴圈法和快排優化)

2022-02-23 15:07:40 字數 2969 閱讀 7848

學校練習,簡單的我就不放上來了,值得整理的,我儲存一下

習題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...