生活随笔
收集整理的這篇文章主要介紹了
Queue(队列)-Swift实现与广度优先搜索应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
僅可以在隊首進行刪除,隊尾進行插入的線性表,稱為隊列。
先入隊列,則先刪除(First In First Out),類似Stack
鍵盤的輸入輸出
廣度優先搜索等算法的實現
struct Queue<T> {
private var array =
Array<
T>()
var isEmpty:
Bool {
return array.isEmpty}
var count:
Int {
return array.
count}
var front:
T? {
return array.first}
mutating func enqueque(_ element: T) {array.append(element)}
mutating func dequeue() ->
T? {
guard !isEmpty
else {
return nil }
return array.removeFirst()}
}
復制代碼現在實現的這個隊列就可以工作了,但是還有些地方是不太完美的。
- 1.當enqueue(入隊)操作時,因為是將新的元素加到數組的尾部,所以入隊的時間復雜對為O(1)。 原因:在Swift中,在數組的后面,會預留出一些空的位置
var queue =
Queue<
String>()
queue.enqueque(
"a")
queue.enqueque(
"b")
queue.enqueque(
"c")
[
"a",
"b",
"c", **, **, **]
queue.enqueque(
"d") 后
[
"a",
"b",
"c",
"d", **, **]
復制代碼Array的這種機制也會有問題,因為在數組的末端只會預留少量的位置,當最后一個預留的位置也被插入新的元素后,就需要將整個數組中的元素一起拷貝,到一個新的擁有更多位置的數組中,這時的時間復雜度為O(n),但是這種情況只是偶爾發生,所以平均的時間復雜對還是O(1)。
-
2.當dequeue(出隊)操作時,因為是將數組中的第一個元素刪除,當刪除第一個元素后,數組中剩余的所有元素都需要向前移動一個位置,來填充前面的空白,所以這個時候的時間復雜度為O(n),每當dequeue一次后,時間復雜度都為O(n),這種操作效率是很低的。
-
Swift的實現(稍高效) 稍稍高效些的隊列的實現辦法有好幾種,比如循環隊列等,我們介紹一個比循環隊列實現簡單些的。
-
思路:不再是每出隊一次,就將數組中的元素向前移動,而是等到滿足一定條件后,才統一的向前移動。
-
代碼
struct Queue<T> {
private var array =
Array<
T?>()
private var headIndex =
0var isEmpty:
Bool {
return array.isEmpty}
var count:
Int {
return array.
count}
var front:
T? {
if isEmpty {
return nil }
return array[headIndex]}
mutating func enqueque(_ element: T) {array.append(element)}
mutating func dequeue() ->
T? {
guard !isEmpty,
let firstElement = array[headIndex]
else {
return nil }array[headIndex] =
nilheadIndex +=
1let percentage =
Double(headIndex)/
Double(array.
count)
if array.
count >
20 && percentage >
0.25 {array.removeFirst(headIndex)headIndex =
0}
return firstElement}
}
復制代碼var relationGraph: [
String: [
String]] = {
var dic: [
String: [
String]] = [
"Me": [
"A",
"C"]]dic[
"A"] = [
"B"]dic[
"C"] = [
"B",
"D",
"Ryan"]dic[
"B"] = [
"Ryan"]dic[
"D"] = [
"Ryan"]
return dic}()
var queue =
Queue<
String>()
var checked = [
String]()
func find(_ name: String) {findFromQueue(name)}
func findFromQueue(_ name: String) {
while queue.
count >
0 {
guard let person = queue.dequeue()
else {
return print(
"Can not find \(name)")}
if checked.
contains(person) {
continue }checked.append(person)
if person == name {
print(
"Find \(name)")
break}
else {enQueueFriends(person)}}}
func enQueueFriends(_ name: String) {
guard let friends = relationGraph[name]
else {
return }
let _ = friends.
map {
return queue.enqueque($
0)}}
復制代碼
enQueueFriends(
"Me")
find(
"Ryan")
復制代碼
總結
以上是生活随笔為你收集整理的Queue(队列)-Swift实现与广度优先搜索应用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。