ARTS Week 1

Oct 28,2019 ~ Nov 3,2019

Algorithm

本周的学习的算法是二分法。二分法可以用作查找即二分查找,也可以用作求解一个非负数的平方根等。下面主要以二分查找为例。
为了后续描述方便理解,先作出如下定义:

  • k:要查找的数字
  • L:待查找的有序序列
  • left:查找区间的左边界
  • right:查找区间的有边界
  • mid:查找区间的中间位置,mid = (left + right) // 2

二分查找重要前提:序列L必须有序
二分查找的基本思路如下:

  1. 根据left,right求mid。
  2. 判断mid是否等于k
  3. 若等于,则返回mid,结束。
  4. 若不等于,则需要判断k与mid的大小关系,若k小于mid,更新high。反之更新low
  5. 循环1~4步,只要left <= right

二分法虽然较为简单,但在实现中仍有一些小的细节需要注意:
更新high和low值时需要注意:若在前半部分,更新时应为right = mid - 1,若在后半部分,更新时应为left = mid + 1。因为mid已经经过判断,所以在更新时要跳过mid。
下面是Python 3语言实现的基本二分查找:

#coding=utf-8

def binary_search(L, k):
    left = 0
    right = len(L) - 1
    while left <= right:
        mid = (left + right) // 2
        if k < L[mid]:
            right = mid - 1
        elif k > L[mid]:
            left = mid + 1
        else:
            return mid
    return -1 # 没有找到

L = [3, 4, 6, 7, 9, 12, 24]
print(binary_search(L, 4))
print(binary_search(L, 8))

二分法亦可以用做求解平方根,左右端变为了0和待求解平方跟的数字c,判断条件变为了 $ mid ^ 2 == c $ ,更新mid时不需要减去1,判断结束循环的条件为是否满足精度,即$ abs(mid^2 - c) > 0.0001 $具体实现的代码如下:

#coding=utf-8

def my_square(c):
    left = 0
    right = c
    mid = (left + right) / 2
    while abs(mid * mid - c) > 0.00000001:
        if mid * mid < c:
            left = mid
        else:
            right = mid
        mid = (left + right) / 2
    return mid

print(my_square(10))

Review

本周读的英文技术文章是:Linux kernel coding style(注:因为文章比较长,而鄙人的英文比较弱,所以本周只有前半部分)
为什么选择这一篇。众所周知,良好的代码风格是易于阅读和理解的。而光靠自己的摸索未必会拥有良好的风格,尤其对那些自认为自己风格还不错的人。(PS:鄙人曾见过认为对代码不进行缩进,而进行的左对齐的人)。阅读他人的风格标准有助于认识到的自己风格中的不足和缺陷。最后,鄙人的观点是风格要统一即可,不一定要完全按照某一具体风格。
下面便是阅读时的具体摘录:

  1. 缩进
    缩进应为8个空格,理由是因为更容易更看清楚层次关系,再加上一行代码不超过80个字符,这样就可以避免写出层次很深的代码(一般层次深的原因都是因为循环的问题)。而对于switch语句,可能一个case中处理会比较复杂,因此case语句不进行缩进。示例代码如下:
switch (suffix) {
case 'G':
case 'g':
        mem <<= 30;
        break;
case 'M':
case 'm':
        mem <<= 20;
        break;
case 'K':
case 'k':
        mem <<= 10;
        /* fall through */
default:
        break;
}

此外,一行代码只写一条语句,不允许出现多条语句

if (condition) do_this;
  1. 一行代码的列数,不得超过80个字符。若超出,则需要打断,新起一行并分布在右端。
  2. 花括号和空格
    一、花括号:
  • 左花括号大多数情况不换行,且前面用空格分隔。函数定义中的左花括号需要换行
if (x is true) {
        we do y
}

switch (action) {
case KOBJ_ADD:
        return "add";
case KOBJ_REMOVE:
        return "remove";
case KOBJ_CHANGE:
        return "change";
default:
        return NULL;
}
int function(int x)
{
        body of function
}
  • 右花括号大部分情况需要新起一行且后面不跟其他语句。do-while和else-if语句中需要紧跟右花括号
do {
        body of do-loop
} while (condition);

if (x == y) {

} else if (x > y) {
        ...
} else {
        ....
}
  • 什么时候加花括号?总结起来就是,当超过一条语句时则都需要加花括号。if-else语句要加括号则都加,要不加都不加,不能有一个加而另一个不加的情况。
if (condition)
        action();

if (condition)
        do_this();
else
        do_that();

if (condition) {
        do_this();
        do_that();
} else {
        otherwise();
}

二、空格

  • 大部分关键词后面读需要空格,除了sizeof
    if, switch, case, for, do, while
  • 涉及到指针时,表示指针和去地址时,运算符应该靠近变量名而不是类型名
char *linux_banner;
unsigned long long memparse(char *ptr, char **retptr);
char *match_strdup(substring_t *s);
  • 二元运算符的左右都需要空格分开
    = + - < > * / % | & ^ <= >= == != ? :
  • 一元运算符和前缀/后缀++,--不要用空格分离
    & * + - ~ ! sizeof typeof alignof __attribute__ defined ++ --
  1. 命名:拒绝大小写混写
  2. Typedef的使用
  • 尽量避免使用Typedef,对于通过指针或结构体直接访问的则不需要typedef
  • 以下情况可以使用Typedef:隐藏某些类型、消除可能因为系统的不同而带来同一类型不同的影响(比如:int)、用于类型检查检查的新类型、于C99标准有冲突
  1. 函数
  • 函数要尽可能短小,因为标准显示屏是80*24的。函数中的局部变量不应太多,不宜超过5-10个。
  • 函数声明时需要包含参数名,不可是仅仅有类型
  1. goto的使用
  • 尽量避免使用goto语句
  • 使用goto的原因为:不需要注释更容易理解、减少嵌套、避免发生错误时产生未定义的行为、减少编译器的工作
  1. 注释
  • 注释的内容要聚焦于WHAT your code does,而不是HOW,如有必要可以解释下WHY
  • 函数的说明注释应放置到函数的外面,而不是函数的内部
  • 多行注释的格式:
/*
 * This is the preferred style for multi-line
 * comments in the Linux kernel source code.
 * Please use it consistently.
 *
 * Description:  A column of asterisks on the left side,
 * with beginning and ending almost-blank lines.
 */
  1. emacs的配置
    因为emacs是GNU开发的,对C代码的风格会进行自动修改风格,为了让其满足Kernel的风格,将以下内容增加到.emacs文件中。
(defun c-lineup-arglist-tabs-only (ignored)
  "Line up argument lists by tabs, not spaces"
  (let* ((anchor (c-langelem-pos c-syntactic-element))
         (column (c-langelem-2nd-pos c-syntactic-element))
         (offset (- (1+ column) anchor))
         (steps (floor offset c-basic-offset)))
    (* (max steps 1)
       c-basic-offset)))

(add-hook 'c-mode-common-hook
          (lambda ()
            ;; Add kernel style
            (c-add-style
             "linux-tabs-only"
             '("linux" (c-offsets-alist
                        (arglist-cont-nonempty
                         c-lineup-gcc-asm-reg
                         c-lineup-arglist-tabs-only))))))

(add-hook 'c-mode-hook
          (lambda ()
            (let ((filename (buffer-file-name)))
              ;; Enable kernel mode for the appropriate files
              (when (and filename
                         (string-match (expand-file-name "~/src/linux-trees")
                                       filename))
                (setq indent-tabs-mode t)
                (setq show-trailing-whitespace t)
                (c-set-style "linux-tabs-only")))))

Tip

Python语言中A += BA = A + B的区别:

  • 对于不可变的类型,A += BA = A + B是没有区别的。
  • 对于可变类型, A += B是在原值上进行修改的,而A = A + B则是新建一个存储计算结果
    那么,Python中的可变类型和不可变类型分别有什么:
  • 可变类型:Set(集合)、List(列表)、Dictionary(字典)
  • 不可变类型:Number(数字)、String(字符串)、Tuple(元组)
    测试代码和运行结果如下:
#coding=utf-8

L1 = [1]
L2 = [1]
print('Init id(L1) = '+str(id(L1)))
L1 += [2]
print('Now id(L1) = '+str(id(L1)))
print('Init id(L2) = '+str(id(L2)))
L2 = L2 + [2]
print('Now id(L2) = '+str(id(L2)))

运行结果如下:

Init id(L1) = 140542507966344
Now id(L1) = 140542507966344
Init id(L2) = 140542507966408
Now id(L2) = 140542506992520

Sharing

ARTS是陈皓大佬的发起的一个活动,具体活动内容不再此处赘述。之前一直想写文章,但又不知道具体该写什么内容,虽然有一些内容想写,但是又怕自己挖坑+写不好。因此借助ARTS活动来提升自己的算法能力、英文阅读能力、文字表达能力以及一些知识点的总结和我个人的思考、感想。以后我会在保证每周ARTS的同时,尽可能写作其他技术内容。

文章若有纰露和不足之处,还望大家批评指正。

原文地址:https://www.cnblogs.com/mengxinayan/p/11789830.html

时间: 2024-10-11 23:13:37

ARTS Week 1的相关文章

error:Please check whether you installed aRts correctly or use

编译kdelibs-3.5.10.tar.gz checking whether uic supports -L ... yes checking whether uic supports -nounload ... yes checking if Qt needs -ljpeg... no checking for rpath... yes checking for KDE... will be installed in /usr/local/kdelibs3checking grepping

KDE声音服务器 arts

arts介绍arts是KDE的核心声音系统,支持多音频流.全双工.网络声音请求.ALSA与OSS驱动后端.JACK声音服务器后端等扩展,它既是声音服务器,也 提供一套音频软件的开发类库.对于KDE3.x系统来说arts是不可缺少的一部分,KDE中几乎所有与声音有关的特性都和arts有平滑稳定的集成.由于arts是其作者的个人秀,在2004年底作者宣布终止对arts的维护后它已经很难再作出进一步的突破,这之后的更新大多都是其他志愿者的零敲碎 打,而且其艰涩的开发框架对后来者也是一个接手门槛.尽管a

ARTS第五周

ARTS第五周 ARTS是什么? Algorithm:每周至少做一个leetcode的算法题: Review:阅读并点评至少一篇英文技术文章: Tip/Techni:学习至少一个技术技巧: Share:分享一篇有观点和思考的技术文章. Algorithm 题目:买卖股票的最佳时机 IV 解题思路 这是LeetCode上买卖股票系列的最后一题,也是难度最大的一题.这里我们用标准的动态规划算法来解这道题,既然是用动态规划的办法,那就要先定义出动态规划的状态和状态转移方程. 状态:根据题意,我们需要定

ARTS第六周

ARTS第六周 ARTS是什么? Algorithm:每周至少做一个leetcode的算法题: Review:阅读并点评至少一篇英文技术文章: Tip/Techni:学习至少一个技术技巧: Share:分享一篇有观点和思考的技术文章. Algorithm 题目:141. Linked List Cycle 解题思路 本题是链表相关的一道题,题目给出一个链表,问我们这个链表中是否有环.题目中给出了三个例子来帮助我们分析是否有环,我们可以简单理解为,判断链表中是否有节点被超过两个节点的next指针指

ARTS第七周

ARTS是什么? Algorithm:每周至少做一个leetcode的算法题: Review:阅读并点评至少一篇英文技术文章: Tip/Techni:学习至少一个技术技巧: Share:分享一篇有观点和思考的技术文章. Algorithm 本周的算法题是一道关于链表的题目19. Remove Nth Node From End of List,给定一个列表,要求移除倒数第n个节点,并返回头结点. ? 解题思路 由于我们并不知道列表有多长,所以得遍历列表探测当前节点是否是列表尾节点,又因为我们需要

ARTS第八周

ARTS是什么? Algorithm:每周至少做一个leetcode的算法题: Review:阅读并点评至少一篇英文技术文章: Tip/Techni:学习至少一个技术技巧: Share:分享一篇有观点和思考的技术文章. Algorithm 题目:206. Reverse Linked List 解题思路 题目要求反转列表,即原本指向后一个节点的当前节点转而指向它的前一个节点,因此我们使用两个指针来分别表示当前节点和前一个节点,调转当前节点指针指向前一个后,然后依次遍历.. 代码 public L

ARTS第九周

ARTS第九周 ARTS是什么? Algorithm:每周至少做一个leetcode的算法题: Review:阅读并点评至少一篇英文技术文章: Tip/Techni:学习至少一个技术技巧: Share:分享一篇有观点和思考的技术文章. Algorithm 题目:21. Merge Two Sorted Lists 解题思路 此题要求我们合并两个排好序的链表,合并之后的链表要求也是有序的,因此我们在每次做合并操作的时候需要比较两个链表头节点的大小,较小的那个节点加到新链表的尾端. 同时,取较小节点

ARTS第十周

ARTS第十周 ARTS是什么? Algorithm:每周至少做一个leetcode的算法题: Review:阅读并点评至少一篇英文技术文章: Tip/Techni:学习至少一个技术技巧: Share:分享一篇有观点和思考的技术文章. Algorithm 题目:20. Valid Parentheses 解题思路 1.根据题意需要进行括号配对,当遇到左括号的时候需要存起来,以便遇到右括号的时候去取出来进行配对:当遇到右括号的时候就直接去和保存的左括号进行配对. 2.根据配对的特性我们采用栈这种数

AI太复杂?别怕!华为云Model Arts让你分分钟玩转AI!

近两年来,随着全球科学技术的高速发展,AI人工技术已经成了世界各先进国家未来科技发展的焦点,为了能够跟上全球科技发展的大潮流,各国科技界都已集结全部力量,希望能在AI人工智能领域取得有效突破. "未来科技世界是属于AI人工智能的"--仿佛一夜之间,家居,电子产品,电商,汽车,互联网等各种产业都想要搭上AI人工智能这辆通往未来的高速列车,"AI+xx"也成了最新潮的产业布局模式.可是,市场上还有一部分,准确地说是很大一部分传统产业在推进AI的过程中遭遇了瓶颈期--AI

ARTS起始篇

ARTS简要说明(每周需要完成以下四项): Algorithm:每周至少做一道 leetcode 的算法题,编程训练.刻意练习. Review:需要阅读并点评至少一篇英文技术文章,这个是四项里面对我最难的一项.要成为技术高手,英文是必修课. Tip:学习至少一个技术技巧,可以是日常工作中遇到的问题.踩的坑,学习的点滴记录. Share:分享一篇有观点和思考的技术文章.持续的输出,建立自己的影响力. —— 2019.06.08 原文地址:https://www.cnblogs.com/jxl001