Interesting卡常数

本文分享了C++编程在信息学奥林匹克竞赛(NOIP)中的优化技巧,包括IO优化、循环展开、取模优化等,旨在减少运行时间,提高代码执行效率。

1102665-20170814194442084-323855207.png

C++ Interesting卡常数

作为一名OIer,在Noip中卡(kǎ 我就爱读kǎ)常数可以说是必备技巧。在此总结一下我所知卡常数的神奇手法:

  1. IO优化
    • fread 和 fwrite ,如果还想再优化有mmap....(然而并不会用,好像也没用。。。)
    • 读入优化(这个非常重要!!!!!!!)
    inline int Read()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
        while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
        return x*f;
    }
    • 输出优化好像用不到唉( ˇˍˇ )
  2. inline
    在声明函数之前写上inline修饰符(就像上面Read()一样),可以加快一下函数调用,但只能用于一些操作简单的函数。涉及递归,大号的循环等很复杂的函数,编译器会自动忽略inline。

  3. register
    在定义变量前写上register修饰符,用于把变量放到CPU寄存器中,适用于一些使用频繁的变量:
register int n,m;

寄存器空间有限,如果放得变量太多,多余变量就会被放到一般内存中;
快,不是一般的快,快到什么程度呢?:

    register int a=0;
    for(register int i=1;i<=999999999;i++)
    a++;
    int a=0;
    for(int i=1;i<=999999999;i++)
    a++;

结果:
优化:0.2826 second
不优化:1.944 second
恐怖啊!!!!

  1. 循环展开

    循环展开也许只是表面,在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(前提是你的 CPU 不是某 CPU)...

  2. 取模优化(仅O2)
//设模数为 mod
inline int inc(int x,int v,int mod){x+=v;return x>=mod?x-mod:x;}//代替取模+
inline int dec(int x,int v,int mod){x-=v;return x<0?x+mod:x;}//代替取模-
  1. 前置 ++

    后置 ++ 需要保存临时变量以返回之前的值,在 STL 中非常慢。事实上,int 的后置 ++ 在实测中也比前置 ++ 慢 0.5 倍左右(UOJ 上自定义测试)

  2. 不要开bool,所有bool改成char,int是最快的(原因不明)。

  3. if()else语句比()?():()语句要慢,逗号运算符比分号运算符要快。

  4. 数据结构用指针代替数组(个人觉得无关紧要)

    数组在用方括号时做了一次加法才能取地址!
    所以在那些计算量超大的数据结构中,你每次都多做了一次加法!!!在 64 位系统下是   long long 相加,效率可想而知。

转载于:https://www.cnblogs.com/widerg/p/7353866.html

<think>首先,用户的问题是:“interesting loop 在编程或计算机科学中的含义”。用户意图是了解“interesting loop”在编程或技术领域的含义。 我需要确保我的回答符合系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - [^1]: 关于迭代循环在硬件层面的优势。 - [^2]: 关于“机械同情”的概念。 - [^3]: 关于树在计算机科学中的直观性。 这些引用提到“迭代循环”和硬件效率,但用户的问题是关于“interesting loop”。我需要检查“interesting loop”是否是计算机科学中的标准术语。 回想一下: - “Interesting loop”不是一个见的术语。我怀疑它可能是一个误写或特定上下文中的术语。 - 可能用户指的是“infinite loop”(无限循环),但“interesting”不是“infinite”。 - 或者可能是“event loop”(事件循环),但“interesting”不匹配。 - 在编程中,见的循环类型有:for循环、while循环、do-while循环、递归等。 - 引用[^1]讨论了迭代循环相对于递归的优势,提到了硬件层面的效率。 用户说:“我想用户意图是了解'interesting loop'在编程或技术领域的含义。” 所以,我应该基于上下文推断。 可能的解释: - 用户可能打错了,意思是“infinite loop”。 - 或者“interesting loop”是一个特定框架或上下文中的术语。 - 在计算机科学中,“loop”泛指重复执行代码的结构。 - 引用[^1]提到“Iterative loops”,即迭代循环,强调在硬件层面的效率。 基于引用,我可以推断“interesting loop”可能指的是迭代循环,因为引用[^1]讨论了它的优势。 我的回答结构: 1. **澄清术语**:由于“interesting loop”不是标准术语,我需要先解释这可能是什么。 2. **基于上下文解释**:参考提供的引用,特别是[^1],讨论迭代循环。 3. **逐步解释**:解释循环在编程中的作用,迭代递归的区别,以及为什么迭代循环在硬件上更高效。 4. **添加引用**:在相关部分末尾自然地添加引用标识。 5. **生成相关问题**:在最后添加相关问题部分。 确保使用中文。 大纲: - 开头:确认问题,解释术语。 - 主体: - 解释循环在计算机科学中的一般概念。 - 讨论迭代循环,引用[^1]。 - 提及“interesting”可能的意义,如高效的或优化的循环。 - 结尾:总结。 - 相关问题。 引用标识: - 引用[^1]:关于迭代循环的硬件优势。 - 引用[^2]:关于“机械同情”,可以联系到优化循环以匹配硬件。 - 引用[^3]:关于树结构,可能不直接相关,但可以忽略或间接联系。 回答内容: 1. 介绍循环的基本概念。 2. 解释“interesting loop”可能指的是高效或优化的迭代循环。 3. 引用[^1]来支持迭代循环的优势。 4. 可能讨论如何使循环“interesting”,如通过优化。 5. 生成相关问题。 相关问题示例: 1. 如何优化循环以提高性能? 2. 迭代循环和递归有什么区别? 3. 什么是事件循环在编程中的应用? 现在,构建回答。</think>### 回答:'interesting loop' 在编程或计算机科学中的含义 在编程或计算机科学领域,“interesting loop” 不是一个标准术语。它可能是一个非正式表达或特定上下文中的描述,但我可以基于见概念和您的引用(如迭代循环的优势)来推断其含义。通,“loop”(循环)指代重复执行代码块的结构,如 `for`、`while` 或 `do-while` 循环。而“interesting”可能暗示这种循环在效率、优化或应用方面具有引人注目的特性,例如在硬件层面高效运行或解决复杂问题。下面我将逐步解释其可能含义,并确保回答真实可靠。 #### 1. **循环的基本概念和作用** - 在编程中,循环用于重复执行任务,避免代码冗余。见类型包括: - **迭代循环**:如 `for` 或 `while` 循环,基于条件重复执行代码块。 - **递归**:函数调用自身来解决问题,但可能引入栈开销(如引用[^1]所述)。 - 数学上,循环的执行次数可以用迭代变量表示,例如 $n$ 次循环的时间复杂度为 $O(n)$。 - “Interesting loop”可能指代那些在性能、可读性或创新性上“有趣”的循环实现,比如优化后的迭代循环,它比递归更高效。 #### 2. **'interesting loop' 的可能含义:基于上下文和引用** - 根据您提供的引用[^1],迭代循环在硬件层面更高效,因为它只涉及简单的测试和条件跳转,而递归需要频繁的栈操作(如压栈和弹栈)。这体现了“机械同情”(Mechanical Sympathy)的概念,即编程时应匹配硬件特性以提升性能[^2]。因此,“interesting loop” 可能指代: - **高效的迭代循环**:在算法中,通过迭代实现高吞吐量,例如在排序或数据处理中减少资源消耗。 - **优化后的循环**:例如使用循环展开(loop unrolling)或向量化来加速执行,这在系统级编程中很见。 - **特定应用中的创新循环**:如事件循环(event loop)在异步编程中处理并发任务,或在游戏开发中实现实时更新。 - 为什么“interesting”?因为这类循环往往结合了算法优化和硬件意识,能显著提升性能,使其在实际应用中“引人注目”。 #### 3. **实际示例:迭代循环 vs. 递归** - 以快速排序为例(参考您的示例),递归实现简洁但可能有栈溢出风险;而迭代版本使用显式栈管理,更高效: ```python # 迭代快速排序示例 def iterative_quick_sort(arr): stack = [(0, len(arr) - 1)] while stack: low, high = stack.pop() if low < high: pivot_index = partition(arr, low, high) stack.append((low, pivot_index - 1)) stack.append((pivot_index + 1, high)) return arr ``` - 这里,迭代循环避免了递归的栈开销,体现了“interesting”特性:在硬件层面更优[^1]。 - 数学上,迭代循环的效率可以用公式表示:例如,循环的迭代次数为 $k$,则时间复杂度为 $O(k)$,而递归可能为 $O(n \log n)$ 但隐含数因子更高。 #### 4. **总结:'interesting loop' 的核心意义** - 在计算机科学中,“interesting loop” 可能泛指那些在性能、设计或应用上具有优势的循环结构,尤其强调迭代循环的硬件友好性。它提醒我们编程时应考虑“机械同情”[^2],选择匹配底层硬件的循环方式,以实现高效执行。如果您有更多上下文(如特定框架或代码示例),我可以进一步澄清。 ### 相关问题 1. 如何优化循环以提高代码性能? 2. 迭代循环和递归在算法设计中有什么区别和适用场景? 3. 事件循环(event loop)在异步编程中如何工作?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值