*************************************************************************************************
优化原则:
最最首先要考虑的问题是:我选择的核心算法是否可以改进,然后考虑算法的实现是否完整,有没有与原始算法存在出入的地方,最
后优化代码,如下:
1.优化最为核心的代码-->1.最为常用的函数,2.计算量很大的函数,3.实现核心算法的函数
2.优化嵌套for循环,尽量减少循环的层次,尽量让小循环在外层,大循环在内层,尽量不要在for循环内部执行if语句,尽量不在
for循环内部创建临时变量(在外面创建临时变量),尽量不重复计算相同的表达式(用临时变量存储),例如下面的代码就不好
for(int i = 0;i<100;i++)
{
a = (c*d/f-e)*2;
b = (c*d/f-e)*2;
}
上面的代码中“(c*d/f-e)*2”就是重复计算,我们可以将它改为:
int temp = (c*d/f-e)*2;
for(int i = 0;i<100;i++)
{
a = temp;
b = temp;
}
在我的印象中:赋值运算比四则运算要块!上面的优化策略虽然提高了速度,但是可能造成代码很难理解!需要权衡,当然建议尽
量优化,同时增加必要的注释!
3.优化if语句,如果是单条件,尽量让表达式简单,例如:“if(condition == true){...}”应该改为“if(condition){...}”
如果是多条件,尽量优化这些条件排放的顺序,因为:(条件1 && 条件2)语句中
当 条件1 不成立的时候是不会判断 条件2 的,(条件1 || 条件2)语句中,当 条件1 成立的时候是不会判断 条件2 的!
4.优化return语句,尽量不产生临时变量然后返回,这样计算量会加大。如果可以,尽量直接返回表达式。例如:不要出现如下代码
int a;
a = b+c;
return a;
将上面的代码直接改为:return a+b;可以提高速度!
又例如:不要出现如下的代码:
if(condition)
return true;
else
return false;
应该直接改为:return condition;
5.优化所有的 *2 或 /2语句,改为左移或者右移。当然编译器如果能自动将 *2 或者 /2 转化为左移或者右移就另当别论!
6.优化所有的 a = a + b;语句,改为 a += b;
7.如果可以,尽量以 “引用传递” 的方式将参数传入函数体,尽量以“引用传递”的方式返回结果!
8.检查所有的 new 语句,一定要有配套的 delete 语句与之对应!防止因为没有及时释放内存而导致内存泄漏!
9.优化指针,for循环中如果有指针操作,如果可能,尽量通过移动指针来直接对内存中的数据进行处理,而不要采用指针首地址+偏
移量的方式来访问数据,简单点儿就是,p[i] = a;是可以优化的,例如:
int *p = &a[0];
for(int i = 0;i<100;i++)
{
p[i] = 1;
//本质是 *(p+i) = 1; 一个加法运算,一个赋值运算
}
上面的代码中p指针没有变化,其实“p[i] = 1” 会转化为“ *(p+i) = 1”;
所以上面的代码可以这样改:
int *p;
for(p = &a[0];p-&a[0]<100;p++)
{
*p = 1;
}
优化后的代码比源代码计算次数少了一次!也就是原始代码的三分之二!
****************************************************************************************************************
相关推荐
单向循环链表是一种特殊的数据结构,每个节点包含一个指向下一个节点的指针,最后一个节点的指针指向头节点,形成闭环。 #### 三、代码解析 1. **数据结构定义**: ```c typedef struct node { int num; // ...
双向循环链表是一种特殊的链表类型,其中每个节点都包含前驱和后继两个指针,并且整个链表形成了一个闭环。这种设计使得链表可以从任意方向进行遍历,并且支持高效的插入和删除操作。在 Linux 内核中,为了减少内存...
与普通单向链表不同,循环链表的最后一个节点的指针不是空的,而是指向链表的第一个节点,形成一个闭合的环。这种设计使得遍历链表更为方便,因为没有明显的"结束"标志。 **单向循环链表特性** 1. **无头结点**:与...
循环单链表与普通单链表的主要区别在于最后一个节点的指针不再为NULL,而是指向链表的第一个节点,形成了一个环状结构。这种结构在处理循环数据流或避免特殊边界条件时非常有用。 首先,我们需要理解链表的基本概念...
循环链表是链表的一种特殊形式,在这种链表中,最后一个节点的指针不是指向`NULL`,而是回指到链表的第一个节点,形成一个闭环。 #### 二、代码解析与实现 ##### 1. 结构体定义 ```c typedef struct node { int ...
在Java编程中,循环单链表是一种特殊的数据结构,它扩展了传统的单链表概念,使得链表的最后一个元素指向第一个元素,形成了一个无尽的循环。这种数据结构在处理循环逻辑或者需要快速访问链表头尾的情况时非常有用。...
循环链表是线性链表的一种特殊形式,其特点是尾节点的指针不为空,而是指向头节点,形成了一个闭环。这种结构使得遍历整个链表变得更为简单,因为不需要额外判断是否到达链表末尾。 **3.2 查询算法** 查询算法是...
4. 循环链表:链表的最后一个节点的指针指向链表的第一个节点,形成一个闭环。 在这个系统中,每个节点可能代表一个文件或目录,包含以下信息: - 文件/目录名:标识该节点的唯一名称。 - 类型:指示是文件还是目录...
- **循环链表**:链表的最后一个节点的指针指向第一个节点,形成闭环,便于从任一节点开始遍历整个链表。 #### Linux内核中的链表实现 在Linux内核中,链表的实现主要集中在`include/linux/list.h`头文件中,采用...
与非循环链表不同的是,循环链表的尾节点通过其指针域指向链表的头结点,从而形成一个闭环。这种结构使得链表的操作更加多样,特别是对于循环单链表,其判空条件变得简单,只需检查头结点的指针是否指向自己。在循环...
循环链表是一种特殊的链表形式,其中最后一个节点的指针不是指向空值,而是指向链表的第一个节点,从而形成一个闭环。这样可以方便地处理循环遍历等问题。 #### 知识点四:代码解析 1. **头文件导入**: ```c #...
- **循环性**:链表的第一个节点的`prev`指针指向最后一个节点,最后一个节点的`next`指针指向第一个节点,形成闭环。 **初始化:** 双向循环链表通常通过`INIT_LIST_HEAD`宏进行初始化: ```c static inline void ...
- **定义**:循环链表是一种特殊的链表形式,其中最后一个节点的next指针不是指向null,而是指向链表的第一个节点,形成了一个闭环。 - **适用场景**:在“围圈报数”问题中,由于所有人围成一个圈,因此循环链表...
- 循环链表是一种特殊类型的链表,其中最后一个节点的指针指向头节点,形成闭环。这种结构便于遍历整个列表,同时,通过设置尾指针,可以快速访问到链表的末尾,从而提高效率。 #### 双向链表 - 双向链表中每个节点...
循环链表的最后一个节点指向链表的头结点,形成一个闭环。循环链表简化了一些操作,如遍历整个链表时无需记录链表尾节点。 #### 三、二叉树 **1. 二叉树基础** 二叉树是一种非线性的数据结构,其中每个节点最多有...
单向循环链表是一种特殊的链表形式,其中最后一个节点的指针指向链表的第一个节点,形成一个闭环。这种结构非常适合处理需要循环遍历的场景,例如本问题中的人员报数并离开的情况。 - **类型定义**:定义单向循环...
总结来说,约瑟夫环问题是一个极好的数据结构教学实例,它涵盖了链表操作、循环数据结构、算法设计与优化等多个方面。通过实践,学生不仅能掌握基本的数据结构知识,还能锻炼逻辑思维和问题解决能力。在进行课程设计...
在单循环链表中,链表的最后一个节点的next指针指向头节点,形成闭环。因此,判断一个节点是否为链尾节点的条件是其next指针是否指向头节点,即`p->next==h`。 #### 6. 构建单链表的时间复杂度 构建一个包含n个节点...
这种链表每个节点不仅有指向下一个节点的指针,还有一个指向前一个节点的指针,形成一个闭环。双向链表提供了前向和后向遍历的能力,使得插入和删除更加灵活。"双向带头循环列表.zip"文件中将展示如何在C语言中实现...