欢迎使用Algorithm
Algorithm是一个库,用于创建智能应用。
特点
- 概率工具
- 期望值
- 可编程概率块
- 数组扩展
- 集合扩展
数据结构
- 双向链表
- 栈
- 队列
- 双端队列
- 红黑树
- 有序集合
- 有序多重集合
- 有序字典
- 有序多重字典
要求
- iOS 8.0+ / Mac OS X 10.9+
- Xcode 8.0+
通信
- 如果您需要帮助,请使用 Stack Overflow。 (标签 'cosmicmind')
- 如果您想提出一个一般性问题的,请使用 Stack Overflow。
- 如果您发现了一个 bug,并且能够提供可靠重现步骤,请创建一个问题。
- 如果您有一个 功能请求,请创建一个问题。
- 如果您想要 贡献,请提交一个pull request。
安装
嵌入式框架需要至少部署到iOS 8的版本。
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它
$ gem install cocoapods
要使用 CocoaPods 将 Algorithm 的核心功能集成到您的 Xcode 项目中,请在您的 Podfile
中指定它
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'Algorithm', '~> 3.1.0'
然后,运行以下命令
$ pod install
Carthage
Carthage 是一个去中心化的依赖管理器,它会构建您的依赖并提供二进制框架。
您可以使用 Homebrew 使用以下命令安装 Carthage
$ brew update
$ brew install carthage
要使用 Carthage 将 Algorithm 集成到您的 Xcode 项目中,请在您的 Cartfile 中指定它
github "CosmicMind/Algorithm"
运行 carthage update
来构建框架并将构建的 Algorithm.framework
拖入您的 Xcode 项目。
变更日志
Algorithm 是一个不断增长的项目,在整个开发过程中都会遇到变化。建议在更新版本之前查看 变更日志。
示例
以下是一些示例,展示了算法如何在您的应用程序中被使用。
- 访问示例仓库,查看使用算法的示例项目。
概率
Algorithm中的每一个数据结构都装备了概率工具。
基本概率
例如,确定使用六个数字的骰子掷出一个3的概率。
let die = [Int](arrayLiteral: 1, 2, 3, 4, 5, 6)
if 0.1 < die.probability(of: 3)
// Do something ...
}
条件概率
对于需要更复杂计算的条件概率,请使用分块语句。
let die = [Int](arrayLiteral: 1, 2, 3, 4, 5, 6)
let pOfX = die.probability { (number) in
return 5 < number || 0 == number % 3
}
if 0.33 < pOfX {
// Do something ...
}
期望值
使用六个数字的骰子进行100次试验时,投掷出3或6的期望值。
let die = [Int](arrayLiteral: 1, 2, 3, 4, 5, 6)
if 20 < die.expectedValue(trials: 100, for: 3, 6) {
// Do something ...
}
双链表
双链表数据结构非常适合用于大数据集。以下是其使用示例。
var listA = DoublyLinkedList<Int>()
listA.insert(atFront: 3)
listA.insert(atFront: 2)
listA.insert(atFront: 1)
var listB = DoublyLinkedList<Int>()
listB.insert(atBack: 4)
listB.insert(atBack: 5)
listB.insert(atBack: 6)
var listC = listA + listB
listC.cursorToFront()
var value = listC.cursor
while nil != value {
// Do something ...
value = listC.next()
}
栈
栈数据结构是一个容器,其中的对象根据后进先出(LIFO)的原则被插入和移除。下面是其实例用法的示例。
var stack = Stack<Int>()
stack.push(1)
stack.push(2)
stack.push(3)
while !stack.isEmpty {
let value = stack.pop()
// Do something ...
}
队列
队列数据结构是一个容器,其中的对象根据先进先出(FIFO)的原则被插入和移除。以下是其实例用法的示例。
var queue = Queue<Int>()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
while !queue.isEmpty {
let value = queue.dequeue()
// Do something ...
}
双端队列
双端队列是同时按照先进先出(FIFO)和后进先出(LIFO)原则插入和移除对象的容器。本质上,双端队列是栈和队列的结合。以下是其实例用法的示例。
var dequeA = Deque<Int>()
dequeA.insert(atBack: 1)
dequeA.insert(atBack: 2)
dequeA.insert(atBack: 3)
while !dequeA.isEmpty {
let value = dequeA.removeAtFront()
// Do something ...
}
var dequeB = Deque<Int>()
dequeB.insert(atBack: 4)
dequeB.insert(atBack: 5)
dequeB.insert(atBack: 6)
while !dequeB.isEmpty {
let value = dequeB.removeAtFront()
// Do something ...
}
红黑树
红黑树是一种平衡二叉搜索树,它以O(logn)的复杂度维护插入、删除、更新和搜索操作。以下红黑树的实现还包括一个有序统计,允许使用类似于数组或字典的下标来访问数据结构。红黑树可以存储唯一键或非唯一键值。以下是其实例用法的示例。
var ages = RedBlackTree<String, Int>(uniqueKeys: true)
ages.insert(value: 16, for: "Sarah")
ages.insert(value: 12, for: "Peter")
ages.insert(value: 23, for: "Alex")
let node = ages[1]
if "Peter" == node.key {
// Do something ...
}
有序集合
有序集合是一种强大的数据结构,用于算法和分析设计。有序集合中的元素是唯一的,并且插入、删除和搜索操作具有O(logn)的复杂度。以下有序集合的实现还包括一个有序统计,允许使用数组的索引下标来访问数据结构。以下是其实例用法的示例。
let setA = SortedSet<Int>(elements: 1, 2, 3)
let setB = SortedSet<Int>(elements: 4, 3, 6)
let setC = SortedSet<Int>(elements: 7, 1, 2)
let setD = SortedSet<Int>(elements: 1, 7)
let setE = SortedSet<Int>(elements: 1, 6, 7)
// Union.
setA + setB
setA.union(setB)
// Intersection.
setC.intersection(setD)
// Subset.
setD < setC
setD.isSubset(of: setC)
// Superset.
setD > setC
setD.isSuperset(of: setC)
// Contains.
setE.contains(setA.first!)
// Probability.
setE.probability(of: setA.first!, setA.last!)
SortedMultiSet
SortedMultiSet与SortedSet基本相同,区别在于SortedMultiSet允许非唯一元素。可以参考SortedSet部分以了解其应用示例。
SortedDictionary
SortedDictionary是一种强大的数据结构,用于维护按顺序排列的键值对集合。SortedDictionary中的键是唯一的,插入、删除、更新和搜索操作的复杂度为O(logn)。
SortedMultiDictionary
SortedMultiDictionary与SortedDictionary相似,区别在于SortedMultiDictionary允许非唯一键。下面是使用SortedMultiDictionary的示例。
struct Student {
var name: String
}
let sarah = Student(name: "Sarah")
let peter = Student(name: "Peter")
let alex = Student(name: "Alex")
var students = SortedMultiDictionary<String, Student>()
students.insert(value: sarah, for: sarah.name)
students.insert(value: peter, for: peter.name)
students.insert(value: alex, for: alex.name)
for student in students {
// Do something ...
}
授权协议
MIT许可证(MIT)
版权所有(C)2019,CosmicMind,Inc. http://cosmicmind.com。保留所有权利。
在此授予任何人无限制、不收费使用本软件及相關文件(以下简称“软件”)的权限,包括但不限于使用、复制、修改、合并、发布、分发、再授权和/或转售软件副本的权限,并允许获提供软件的个人进行上述操作,但需遵守以下条件
上面的版权声明和此许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权持有人不对任何索赔、损害或其他责任负责,无论源于合同、侵权或其他行为,与软件或其使用无关。