Nov 4,2019 ~ Nov 10,2019

Algorithm

本周主要的算法是如何求两个数的最大公因数。传统的想法便是对这两个数分解质因数,而后找到其公共因数,再相乘,这样就会得到最大公因数了。话不多说,直接看代码吧。

# 求解一个数字x的质因数。注意循环的范围,若在范围内没有找到因数,则说明它是一个素数
import math
def factors(x):
y = int(math.sqrt(x))
R = []
for i in range(2, y+1):
if x % i == 0:
R.append(i)
R = R + factors(x//i)
break
else:
R = [x]
return R def product(L):
y = 1
for i in L:
y = y * i
return y def GCD_factors(x, y):
Lx = factors(x)
Ly = factors(y)
def search_and_delete(a, L):
for i in range(len(L)):
if L[i] == a:
return True, L[:i] + L[i+1:]
return False, L
R = []
for e in Lx:
found, Ly = search_and_delete(e, Ly)
if found:
R.append(e)
return product(R)

但是,显然可以看出,先求解因数,再求解公共因数集合,最后相乘得到结果。这种算法求解最大公因数的时间开销是较大的,虽然便于理解。那还有一种更快的求解方法,那就是辗转相除法(又称欧几里德算法),算法主要用到了一个等式,具体如下:

  • GCD:求解x,y的最大公因数
  • mod:求余数。例如\(a \bmod b\)表示求解a除以b的余数
  • 注,下面的描述中假设$ a > b $

\[GCD(a,b) = GCD(b, a \bmod b)
\]

下面用实际计算过程作为一个例子:

$ GCD(12, 8) = GCD(8, 12 \bmod 8) = GCD(8, 4) = GCD(4, 8 \bmod 4) = GCD(4, 0) = 4 $

有了上面的描述,那么代码就很好写了,代码如下:

def GCD_Euclid(x, y):
if x < y:
x, y = y, x
if x % y == 0:
return y
return GCD_Euclid(y, x % y)

Review

本周继续上周的没有完成的文章,Linux Kernel coding style,开始吧

  1. Kconfig文件

    Kcinfig文件的缩进有所不同,而其中的help只需要两格缩进,如果有危险的地方,需要用大写提醒。缩进格式如下。
config AUDIT
bool "Auditing support"
depends on NET
help
Enable auditing infrastructure that can be used with another
kernel subsystem, such as SELinux (which requires this for
logging of avc messages output). Does not do system-call
auditing without CONFIG_AUDITSYSCALL.
config ADFS_FS_RW
bool "ADFS write support (DANGEROUS)"
depends on ADFS_FS
  1. 数据结构:数据结构需要注意的要进行引用计数,以防止产生垃圾和遭遇锁定。

  2. 宏定义,枚举

    宏定义和枚举类型的变量必须使用大写。

#define CONSTANT 0x12345

宏定义的函数可以像普通函数一样,函数名采用小写。但要尽量避免写宏定义函数,可以用内联函数去替代。使用宏定义函数有如下几个需要注意的地方,下面的例子均为反例

  • 不要影响控制流
#define FOO(x)                                  \
do { \
if (blah(x) < 0) \
return -EBUGGERED; \
} while (0)
  • 避免依赖于局部变量
#define FOO(val) bar(index, val)
  • 不要用作左值
FOO(x) = y;
  • 注意优先级,宏定义函数中宏定义变量要用括号扩起来
#define CONSTANT 0x4000
#define CONSTEXP (CONSTANT | 3)
  • 在其中定义局部变量时,注意和已有的变量名冲突
#define FOO(x)                          \
({ \
typeof(x) ret; \
ret = calc_ret(x); \
(ret); \
})
  1. 打印内核消息,尽量使用简短正式的语言,准确的描述信息。

  2. 分配内存

    为结构体分配内存尽量使用如下代码:

p = kmalloc(sizeof(*p), ...);

分配数组尽量使用如下代码:

p = kmalloc_array(n, sizeof(...), ...);

分配归零数组尽量使用如下代码:

p = kcalloc(n, sizeof(...), ...);
  1. 内联函数。

    大量的使用inline会导致CPU中的icache占用量更大,从而带来无法命中,反而降低了效率。

    内联要尽可能简单,文章中给出的建议代码行数不要多于三行。例外情况是,参数是编译时常量。

  2. 函数返回值和类型

    bool类型和整数类型的滥用可能会带来风险,虽然有时编译器能帮我们发现这些。

    当函数表示动作或命令时,返回值类型应为整数

    当函数表示谓词(比如是否)时,返回值类型应为bool

  3. 不要重新发明内核宏

    如果内核中已有某功能的宏函数,那么不要自己编写函数。比如计算数组的长度。请利用如下宏函数。

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
  1. 不要把个人的对编辑器的设置存放到代码中

  2. 内联汇编

    大量的汇编代码要放到.s文件中。

    也许会需要把汇编代码标记为volatile,以防止GCC在将它去除

    若有多行汇编,每行汇编要新起一行,不要放在一行代码里。

asm ("magic %reg1, #42\n\t"
"more_magic %reg2, %reg3"
: /* outputs */ : /* inputs */ : /* clobbers */);
  1. 条件编译

    不要将条件编译语句放到.c文件中

    条件编译最小范围应为函数,而不是表达式等其他

Tip

在Python中,列表的分片会带来复制产生新列表。而使用索引就不会带来这个问题。在一些函数中,参数使用索引来控制访问列表可以提高效率,尤其是在一些递归函数中,因为自始自终列表都没有发生变化。

Share

看完Linux内核代码风格,虽然有一些东西我在编写C语言时基本没有使用过(有可能是我没有涉及到),但仍有一些东西还是让我有了一些新的知识。就比如内联函数,我之前的了解是那只是对编译器的一种建议,并不一定会内联。从来不知道内联函数过多会带来性能较低的问题。当然文章里面也有一些东西我认为是很正常的要求,比如内联汇编有多行需要换行,但文中仍提及到了,那说明还是有些人并不如此认为

ARTS Week 2的更多相关文章

  1. KDE声音服务器 arts

    KDE声音服务器 arts arts介绍arts是KDE的核心声音系统,支持多音频流.全双工.网络声音请求.ALSA与OSS驱动后端.JACK声音服务器后端等扩展,它既是声音服务器,也 提供一套音频软 ...

  2. 【ARTS】01_21_左耳听风-201900401~201900407

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  3. 【ARTS】01_20_左耳听风-20190325~20190331

    zz## ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 ...

  4. 【ARTS】01_19_左耳听风-20190318~20190324

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  5. 【ARTS】01_18_左耳听风-20190311~20190317

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  6. 【ARTS】01_17_左耳听风-20190304~20190310

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  7. 【ARTS】01_16_左耳听风-20190225~20190303

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  8. 【ARTS】01_15_左耳听风-20190218~20190224

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  9. 【ARTS】01_14_左耳听风-20190211~20190217

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  10. 【ARTS】01_13_左耳听风-20190204~20190210

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

随机推荐

  1. 初学者的API测试技巧

    API(应用程序编程接口)测试是一种直接在API级别执行验证的软件测试.它是集成测试的一部分,它确认API是否满足测试人员对功能.可靠性.性能和安全性的期望.与UI测试不同,API测试是在没有GUI层 ...

  2. 搭建nginx

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...

  3. 测开大佬告诉你:如何5分钟快速创建restful风格的API接口-使用django restframework框架

    一.思考❓❔ 1.创建API接口难吗? 软件测试工程师: 只测过API接口, 从没创建过 应该需要掌握一门后端开发语言和后端开发框架吧!? 脑容量有限,想想就可怕 2.如何创建API接口呢? 使用Dj ...

  4. Jmeter+Jenkins 搭配进行接口测试

    单纯通过Jmeter的界面进行Web的接口测试,效率低下.为此将Jmeter的接口测试与Jenkins联合,实现持续集成.配置完成后,只需修改运行的Jmeter脚本即可,运行结束后测试结果发送到指定邮 ...

  5. SQL Server2012高可用之事物复制(发布订阅)测试

      (一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既不可写也不可读,即采用的高可用技术为"数据库镜像".存在的问题为 ...

  6. 【转载】解决KindEditor图片上传对话框位置异常问题(浏览器放大缩小时对话框不见了)

    今早在整理文件上传模块的时候,发现富文本编辑器 kindeditor 上传图片的对话框无法显示,其实对话框已经生成了,但是它没有top值,所以在页面上看不见. 捣鼓了一个多小时,代码看了一大串,没解决 ...

  7. 数据库的SQL基本用法 创建 删除 查询 修改

    1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname 3.说明:备份sql server--- 创建 备份数据的 ...

  8. phpstudy nginx设置CORS跨域不起作用的可能解决方法

    今天搞了半天的跨域问题,想通过nginx配置跨域,希望以后本地调试程序都不用为这件事烦心.无非就是设置几个请求头: add_header Access-Control-Allow-Origin *; ...

  9. The command '/bin/sh -c unzip -o php-7.2.23-src.zip' returned a non-zero code: 1

    Dockerfile 内容 #centos7 nginx php redis inotify FROM centos:7 MAINTAINER INFOBIRD RUN yum -y update & ...

  10. NTT - 牛客

    链接:https://www.nowcoder.com/acm/contest/133/D来源:牛客网 题目描述 Applese打开了m个QQ群,向群友们发出了组队的邀请.作为网红选手,Applese ...