gcd

6个结果搞懂 GCD中 QUEUE 和 async/sync

人盡茶涼 提交于 2019-12-09 17:58:45
同一个blockObject SSViewController *firstVC = (SSViewController *)self.window.rootViewController; [firstVC gcdTestMethod:^{ for (int i=1; i<5; i++) { NSString *isMain = [[NSThread currentThread] isMainThread]?@"YES":@"NO"; NSLog(@" 1 ====% 2d %@ Main:%@",i,[NSThread currentThread],isMain); } }]; [firstVC gcdTestMethod:^{ for (int i=1; i<5; i++) { NSString *isMain = [[NSThread currentThread] isMainThread]?@"YES":@"NO"; NSLog(@" 2 ====% 2d %@ Main:%@",i,[NSThread currentThread],isMain); } }]; 这里给6个不同实现和不同的结果: ======================== 1 ============================ - (void)gcdTestMethod:

辗转相除法求最大公约数

99封情书 提交于 2019-12-09 16:45:35
辗转相除法求最大公约数 约数 如果数 a 能被数 b 整除,a 就叫做 b 的倍数,b 就叫做 a 的 约数 。 最大公约数 最大公约数就是两个数中,大家都能相约且最大的数。 辗转相除法 辗转相除法 又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。它是已知最古老的算法,其可追溯至公元前300年前。 这条算法基于一个定理:两个正整数 a 和 b(a 大于 b),它们的最大公约数等于 a 除以 b 的余数 c 和 较小数 b 之间的最大公约数。 算法计算过程是这样的: 2个数相除,得出余数 如果余数不为0,则拿较小的数与余数继续相除,判断新的余数是否为0 如果余数为0,则最大公约数就是本次相除中较小的数。 比如数字 25 和 10 ,使用辗转相除法求最大公约数过程如下: 25 除以 10 商 2 余 5 根据辗转相除法可以得出,25 和 10 的最大公约数等于 5 和 10 之间的最大公约数 10 除以 5 商 2 余 0, 所以 5 和 10 之间的最大公约数为 5,因此25 和 10 的最大公约数为 5 题目要求 完善函数 gcd 的功能。函数 gcd 会计算并返回传入的两个正整数参数之间最大的公约数 如下所示: gcd(30,3); // 返回结果为 3 gcd(12, 24); // 返回结果为 12 gcd(111, 11); /

iOS 多线程—GCD 基本用法

穿精又带淫゛_ 提交于 2019-12-07 21:49:32
什么是进程? 最通俗的描述就是一个个pid,官方的说法:进程是程序在计算机上的一次执行活动。打开一个app 就开启了一个进程。可包含多个线程。 什么是线程? 独立执行的代码段,一个线程同一时间内只能执行一个任务,反之多线程并发就可以在同一时间执行多个任务。 同步和异步 一个同步函数只在完成了预定任务后才返回。会阻塞当前线程。异步时任务开启会立即返回,不阻塞当前线程去执行下一个函数。异步会开启其他线程。 串行和并发 串行:任务按先后顺序逐个执行。并发:后面的任务不会等前面的任务完成了再执行,同样会遵循先添加先执行的原则,但添加间隔往往忽略不计。所以看上去像是一起执行。 并发与并行 并发和并行通常被一起提到,所以值得花些时间解释它们之间的区别。 并发代码的不同部分可以“同步”执行。然而,该怎样发生或是否发生都取决于系统。多核设备通过并行来同时执行多个线程;然而,为了使单核设备也能实现这一点,它们必须先运行一个线程,执行一个上下文切换,然后运行另一个线程或进程。这通常发生地足够快以致给我们并发执行地错觉,如下图所示: 虽然你可以编写代码在 GCD 下并发执行,但 GCD 会决定有多少并行的需求。并行 要求 并发,但并发并不能 保证 并行。 什么是GCD? GCD 是一套低层API,用于将任务切分成单一任务提交至队列并发或者串行执行。遵循FIFO 原则,先提交到队列的先执行

GCD之同步锁和派发队列

你说的曾经没有我的故事 提交于 2019-12-07 15:19:44
在OC中,如果有多个线程要执行同一份代码,那么就可能会出现问题.(比如出现读写不一致的情况)这种情况下通常需要使用锁来实现某种同步机制.在GCD 出现之前,有两种办法,第一种是使用内置的同步块 synchronization block - (void)synchronizedMethod { @synchronized(self) { // } } 这种写法会根据给定的对象自动创建一个锁,并等到块中的代码执行完毕.执行到代码结尾处,锁就会自动释放. 需要注意的是:滥用@synchronized(self)会降低代码的执行效率,因为公用一个锁的那些同步块必须按照顺序执行.若是在self上频繁加锁,那么程序可能要等待另一段无关的代码执行完毕才能继续执行当前的代码. 另一方法是直接使用 NSLock对象. _lock = [[NSLock alloc] init]; - (void)synchronizedMethod_lock { [_lock lock]; // safe [_lock unlock]; } 这两种方法都很好,但是也有缺陷.比如:极端情况下,同步块会导致死锁,而且性能也不见得高效,而如果直接使用锁对象的话,一旦遇上死锁将会非常难处理. 替代方案就是使用GCD,他能以更简单 更高效的形式为代码加锁. 比如说属性就是开发者经常需要同步的地方,这种属性需要做成原子的 .

iOS的定时器用法

大憨熊 提交于 2019-12-07 01:23:36
定时器在项目中还是经常用到的,很多情况下为了省事我们都是在主线程中直接用,但这样经常会造成阻塞,影响定时器的准确性,对时间精度要求比较高的地方还会给人很不好的体验,比如卡顿等等,所以,定时器的使用最好放在子线程中,下面就记录几种定时器的用法: 1、NSThread NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(newThread) object:nil]; [thread start]; - (void)newThread{ @autoreleasepool{ [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(requestMessages) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] run]; } } 2、GCD 首先定义timer: 这里有一点疑惑:timer若作为成员变量(定义放在@interface里面)定时器可以正常使用,但是在方法里面再去定义的定义的话定时器就完全不起作用了,还请知道的原因的小伙伴多多指教: NSTimeInterval period = 60.0; //设置时间间隔 dispatch

ElGamal加密算法

情到浓时终转凉″ 提交于 2019-12-06 22:47:26
ElGamal加密算法 ElGamal加密 是一种公共密钥密码系统。 它使用非对称密钥加密在双方之间进行通信并加密消息。 该密码系统基于难以找到 循环群中 离散对数 的困难, 即使我们知道g a 和g k ,也很难计算g ak 。 ElGamal密码系统的想法 假设Alice想与Bob交流。 鲍勃生成公钥和私钥: 鲍勃选择一个非常大的数 q 和一个循环群 F q 。 从环状基团 ˚F q ,他选择的任何元素 克 和 一个元件 一个 ,使得满足gcd(A,Q)= 1。 然后,他计算h = g a 。 鲍勃发布 F , h = g a , q 和 g 作为他的公钥,并保留 a 作为私钥。 爱丽丝使用鲍勃的公钥加密数据: 爱丽丝 从循环群 F中 选择一个元素 k , 使gcd(k,q)= 1。 然后,她计算出p = g k 和s = h k = g ak 。 她与M乘以s。 然后她发送(p,M * s)=(g k ,M * s)。 鲍勃解密消息: 鲍勃计算s ' = p a = g ak 。 他将M * s除以s ' 得到M,即s = s ' 。 以下是ElGamal密码系统在Python中的实现 # Python program to illustrate ElGamal encryption import random from math import pow a = random

2019年安徽大学ACM/ICPC实验室新生赛(公开赛)D 不定方程

南楼画角 提交于 2019-12-06 13:08:12
题目链接: https://ac.nowcoder.com/acm/contest/2720/D 题意: 对于 ax = by = c ,给出 x, y 求符合条件的 a, b, c 且 c 为最小的解,不满足条件输出 -1。 idea: 容易看出 c 为x, y 的最小公倍数。设最小公倍数为 s ,所以 a = s / x,b = s / y。因为 s = x * y / __gcd(x,y) ,所以 a = y / __gcd(),b = x / __gcd(),所以 x 和 y 一定互质。若__gcd(x, y) != 1,即可输出 -1。否则为最小公倍数。 当时每想出来判断 - 1 的情况,擦 代码: 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 typedef long long ll; 5 ll t, x, y, ans; 6 7 int main() 8 { 9 scanf("%lld",&t); 10 while (t -- ) 11 { 12 scanf("%lld%lld",&x,&y); 13 ll s = __gcd(x, y); 14 if (s != 1) cout << "-1" << endl; 15 else cout << y / s << " " << x / s << " " <<

iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用

為{幸葍}努か 提交于 2019-12-06 10:12:46
介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在Mac OS X 10.6 ,iOS 4及以上也可用。 设计: GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。 一个任务可以是一个函数(function)或者是一个 block 。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。 GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行 dispatch queue分为下面三种: Serial 又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。 Concurrent 又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。 Main dispatch queue 它是全局可用的serial queue,它是在应用程序主线程上执行任务的。

Codeforces Round #511 (Div. 1)

孤街浪徒 提交于 2019-12-06 07:57:52
A - Enlarge GCD 题意:给n个数,那么他们有gcd,去掉最多n-1个数使得他们的gcd变大。求去掉最少的数。 题解:首先如果所有数都相等,那么无解。否则一定有解:最多去掉只剩下最大的那个。gcd是没有影响的,可以直接除掉(注意gcd可以用0来初始化,0和x的gcd都等于x)。然后除去gcd之后每个数有他独特的几种因子,把不含这种因子的数都去掉就可以把这种因子释放出来。暴力sqrt分解会T掉,线性筛/埃筛预处理出每个数的最小质因子(甚至不需要预处理出他的幂,反正除一除也是log级别的)就把复杂度降低到质因子的最大个数(当一直除时,大概27左右)或者质因子的种类(当预处理出每个数含有的最小质因子的幂时,不超过8个),比sqrt的大概4000要快100倍。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 1e7 + 5e6; int p[970704 + 5], ptop; int pm[MAXN + 5], pk[MAXN + 5]; void sieve() { int n = MAXN; pm[1] = 1; pk[1] = 1; for(int i = 2; i <= n; i++) { if(!pm[i]) { p[++ptop] = i; pm

最大公约数和最小公倍数算法

那年仲夏 提交于 2019-12-06 06:30:37
// 最大公约数算法 // 1. a % b 进行取余运算 // 2. 将被取余数与余数进行再次取余运算 // 3. 直到a % b为0时停止取余运算 // 4. 将取余为0时的被取余数返回即是最大公约数 function gcd(a, b) { if (b === 0) { return a; } return gcd(b, a % b); } //最小公倍数算法 //a * b 得到的结果 / gcd(a,b) 得到最小公倍数 function lcm(a, b) { return a * b / gcd(a,b) } 来源: https://www.cnblogs.com/pluslius/p/11965587.html