iOS开发中常见的数据结构
2022-12-06 06:29:14
数据结构:iOS 开发者的必备武器
前言
在 iOS 开发领域,数据结构是至关重要的,它是帮助我们管理和操作数据,提升程序效率和可维护性的基石。本文旨在深入探讨 iOS 开发中常用的数据结构,从数组、字典到图、树等,帮助开发者全面理解并运用这些数据结构。
数组
数组是一种有序集合,其元素具有相同的数据类型。数组中的元素可以通过索引访问,索引从 0 开始。数组的优势在于其元素访问效率高,因为元素在内存中是连续存储的。
var array = [1, 2, 3, 4, 5]
print(array[2]) // 输出:3
字典
字典是一种无序集合,其中元素由键值对组成。字典中的元素可以通过键访问。字典的优势在于其元素查找效率高,因为键通常是唯一的。
var dictionary = ["a": 1, "b": 2, "c": 3]
print(dictionary["a"]) // 输出:1
集合
集合是一种无序集合,其中元素是唯一的。集合的优势在于其元素添加和删除效率高,因为集合内部使用了哈希表来存储元素。
var set = Set([1, 2, 3, 4, 5])
set.insert(6)
print(set) // 输出:{1, 2, 3, 4, 5, 6}
链表
链表是一种线性数据结构,其中元素通过指针连接在一起。链表的优势在于其可以动态地添加和删除元素,而不需要移动其他元素。
class Node {
var value: Int
var next: Node?
init(value: Int, next: Node?) {
self.value = value
self.next = next
}
}
var head = Node(value: 1, next: nil)
var node1 = Node(value: 2, next: nil)
var node2 = Node(value: 3, next: nil)
head.next = node1
node1.next = node2
队列
队列是一种先进先出(FIFO)的数据结构。队列中的元素通过队头和队尾指针访问。队列的优势在于其可以高效地插入和删除元素。
class Queue {
private var head: Node?
private var tail: Node?
func enqueue(_ value: Int) {
let node = Node(value: value)
if let tail = self.tail {
tail.next = node
} else {
self.head = node
}
self.tail = node
}
func dequeue() -> Int? {
guard let head = self.head else {
return nil
}
let value = head.value
self.head = head.next
if self.head == nil {
self.tail = nil
}
return value
}
}
栈
栈是一种先进后出(LIFO)的数据结构。栈中的元素通过栈顶指针访问。栈的优势在于其可以高效地压入和弹出元素。
class Stack {
private var top: Node?
func push(_ value: Int) {
let node = Node(value: value)
node.next = self.top
self.top = node
}
func pop() -> Int? {
guard let top = self.top else {
return nil
}
let value = top.value
self.top = top.next
return value
}
}
图
图是一种数据结构,其中元素由节点和边组成。节点表示图中的元素,边表示节点之间的关系。图的优势在于其可以表示复杂的关系,并可以通过深度优先搜索(DFS)和广度优先搜索(BFS)算法遍历。
class Graph {
private var nodes: [Node]
init(nodes: [Node]) {
self.nodes = nodes
}
func depthFirstSearch(from node: Node) {
var visitedNodes: Set<Node> = []
var stack: Stack = Stack()
stack.push(node)
while let node = stack.pop() {
if !visitedNodes.contains(node) {
visitedNodes.insert(node)
for neighbor in node.neighbors {
stack.push(neighbor)
}
}
}
}
func breadthFirstSearch(from node: Node) {
var visitedNodes: Set<Node> = []
var queue: Queue = Queue()
queue.enqueue(node)
while let node = queue.dequeue() {
if !visitedNodes.contains(node) {
visitedNodes.insert(node)
for neighbor in node.neighbors {
queue.enqueue(neighbor)
}
}
}
}
}
哈希表
哈希表是一种数据结构,其中元素通过哈希函数存储和检索。哈希函数将元素映射到一个键,键可以用来快速检索元素。哈希表的优势在于其查找和插入元素的速度非常快。
class HashTable {
private var table: [Int: Node?]
init(size: Int) {
self.table = [Int: Node?](repeating: nil, count: size)
}
func insert(key: Int, value: Int) {
let node = Node(value: value)
var index = key % self.table.count
if let head = self.table[index] {
node.next = head
}
self.table[index] = node
}
func search(key: Int) -> Int? {
let index = key % self.table.count
var node = self.table[index]
while node != nil {
if node!.key == key {
return node!.value
}
node = node!.next
}
return nil
}
}
树
树是一种数据结构,其中元素通过父节点和子节点连接在一起。树的优势在于其可以表示层次结构,并可以通过深度优先搜索(DFS)和广度优先搜索(BFS)算法遍历。
class Tree {
private var root: Node?
init(root: Node) {
self.root = root
}
func depthFirstSearch(from node: Node) {
var visitedNodes: Set<Node> = []
var stack: Stack = Stack()
stack.push(node)
while let node = stack.pop() {
if !visitedNodes.contains(node) {
visitedNodes.insert(node)
for child in node.children {
stack.push(child)
}
}
}
}
func breadthFirstSearch(from node: Node) {
var visitedNodes: Set<Node> = []
var queue: Queue = Queue()
queue.enqueue(node)
while let node = queue.dequeue() {
if !visitedNodes.contains(node) {
visitedNodes.insert(node)
for child in node.children {
queue.enqueue(child)
}
}
}
}
}
二叉树
二叉树是一种树,其中每个节点最多有两个子节点。二叉树的优势在于其可以表示二叉关系,并可以通过深度优先搜索(DFS)和广度优先搜索(BFS)算法遍历。
class BinaryTree {
private var root: Node?
init(root: Node) {
self.root = root
}
func depthFirstSearch(from node: Node) {
var visitedNodes: Set<Node> = []
var stack: Stack = Stack()
stack.push(node)
while let node = stack.pop() {
if !visitedNodes.contains(node) {
visitedNodes.insert(node)
if let leftChild = node.leftChild {
stack.push(leftChild)
}
if let rightChild = node.rightChild {
stack.push(rightChild)
}
}
}
}
func breadthFirstSearch(from node: Node) {
var visitedNodes: Set<Node> = []
var queue: Queue = Queue()
queue.enqueue(node)
while let node = queue.dequeue() {
if !visitedNodes.contains(node) {
visitedNodes.insert(node)
if let leftChild = node.leftChild {
queue.enqueue(leftChild)
}
if let rightChild = node.rightChild {
queue.enqueue(rightChild)
}
}