一些算法思想 及一些算法基础问题

分治算法

分治算法是一种高效的算法思想,它将问题分解成更小的子问题,通过解决子问题来解决原始问题。它的核心思想是将问题分解成若干个规模更小但结构相同的子问题,并且通过递归的方式解决这些子问题,最终将子问题的解合并起来得到原问题的解。

通常情况下,分治算法包含三个步骤:

  1. 分解:将原问题分解成若干个规模更小但结构相同的子问题。

  2. 解决:递归地解决每个子问题。如果子问题的规模足够小,则直接解决。

  3. 合并:将子问题的解合并起来得到原问题的解。

分治算法在许多领域都有广泛的应用,例如排序算法(如归并排序和快速排序)、查找算法(如二分查找)以及图形问题等。它的时间复杂度通常为 $O(nlogn)$,在某些情况下可以达到 $O(n)$ 的时间复杂度。

需要注意的是,分治算法并不是万能的,它的使用需要满足一定的条件,例如原问题可以分解成多个规模更小的子问题,子问题的结构相同,子问题的解可以合并起来得到原问题的解等。



贪心算法

代码随想录: 什么是贪心

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。

这么说有点抽象,来举一个例子:

例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?

指定每次拿最大的,最终结果就是拿走最大数额的钱。

每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。


时间复杂度分析

本篇从如下六点进行分析:

究竟什么是时间复杂度
什么是大O
不同数据规模的差异
复杂表达式的化简
O(log n)中的log是以什么为底?
举一个例子

代码随想录:关于时间复杂度,你不知道的都在这里!


Q: O(n) 时间复杂度和 O(n log(n)) 时间复杂度,哪个更好?

A: 时间复杂度是衡量算法运行效率的一个重要指标。一般来说,对于同一算法,时间复杂度越低,算法的效率越高。 对于 O(n) 与 O(n log(n)) 时间复杂度的算法,一般各自适用于不同的场景: 1. O(n) 时间复杂度的算法一般适用于数据规模较小的情况,例如数据集大小在 100 左右的场景。 2. O(n log(n)) 时间复杂度的算法一般适用于数据规模较大的场景,例如数据集大小在 1 万甚至 10 万以上的场景。

总的来说,如果能够使用 O(n) 的复杂度解决问题,当然是更好的,因为它的计算量更小,效率更高。但有些问题难以使用 O(n) 的时间复杂度解决,此时可以考虑使用 O(n log(n)) 或更高的复杂度算法。

需要注意的是,时间复杂度不是绝对的,它也会受到实际实现的影响。因此,对于同一算法,如果有两种不同的实现方式,它们的时间复杂度可能也不同,这时候需要具体问题具体分析。



n 和nlog(n)的数学关系是什么样的

n 和 nlog(n) 之间的数学关系是比较特殊的。在计算机科学中,它们通常表示算法的时间复杂度。

一个算法的时间复杂度是指当输入规模为 n 时,算法执行的次数和 n 的关系。而 nlog(n) 时间复杂度则表示随着输入规模向上增长,算法的执行次数呈现与 n*log(n) 成正比的趋势。

在数学上,n,log(n),nlog(n) 分别表示自变量,n 的对数,n 的对数与 n 的乘积。n 的对数(log(n))表示以 2 为底的对数或以 e 为底的自然对数,而 nlog(n) 则表示 n 的对数与 n 的乘积。因此,nlog(n) 是 n 和 log(n) 的乘积,它的增长速度是相当快的。

具体来说,当 n 变化时,nlog(n) 的增长速度比 n 要快,但比 n^2 慢。举个例子,当 n 为 1000 时,nlog(n) 为 9965,n 为 1000,而 n^2 则为 1,000,000,n^2 的增速是要比 nlog(n) 快的。

在算法设计中,时间复杂度是用来估计算法运行效率的重要指标。因此,在设计算法时,通常会尽量选择时间复杂度较低的算法,以确保程序的效率和性能。



快速掌握算法题需要具备以下几个方面的能力:

掌握基本算法知识:首先要学习和掌握基本的算法知识,比如排序、查找、递归、动态规划等,这些知识是算法题的基础,对于快速解决算法题非常重要。

练习刷题:刷题是快速掌握算法题的关键,只有不断地练习和思考,才能提高解题的能力。可以从一些简单的算法题开始练习,逐渐增加难度,同时可以参考其他人的解题思路,学习优秀的解题方法和技巧。

建立思维模型:对于一些常见的算法题,可以建立自己的思维模型,通过对这些模型的熟悉和应用,可以更加快速地解决类似的算法题。比如对于一些搜索算法,可以建立搜索模型,对于一些动态规划问题,可以建立状态转移方程等。

不依赖外部答案:在刷题的过程中,要尽量避免过早地去查看别人的答案,而是要尝试自己思考解题思路和方法,多进行自我思考和实践,锻炼自己的思维能力和独立解题的能力。当遇到困难时,可以先尝试一些自己的解决思路,再参考其他人的解题方法和思路,从中学习和借鉴,不要依赖外部答案。

最后,快速掌握算法题需要长时间的刻意练习和不断的思考,没有捷径可走,只有坚持不懈地努力,才能逐渐提高自己的解题能力和水平。



写算法题 是不是一般都是在开始先限制一些条件。我好像没有这个意识,总是忘记写一些排除

是的,通常在写算法题时,需要明确题目的条件和限制。这些限制可以包括输入数据的格式和范围,输出结果的格式和限制,算法的时间和空间复杂度要求,特定数据结构的要求等等。

如果你忘记写一些限制条件,可能会导致你的算法在某些情况下出现错误,或者无法通过测试用例。因此,在开始解决算法问题之前,建议先认真阅读题目,并明确所有的条件和限制。如果你对一些限制不确定,可以在解题过程中进行确认。



见到算法题应该怎么搞啊,先想思路,然后尝试写出来代码过程和细节嘛?

解决算法问题需要考虑以下这些步骤:

  1. 理解问题:通读问题描述,并确保你完全理解问题的要求。读懂问题的关键,理解问题中隐藏的陷阱。在解决问题之前,确保准确无误的理解。

  2. 分情况思考:有时候,问题会涉及到多种情况,例如输入数据中的一般情况和边缘情况。在你开始解决问题之前,你需要决定你将如何解决这两种情况。使用不同的算法和数据结构的各种情况的差别很大,分情况思考可以帮助你选择合适的方法。

  3. 设计算法:设计一种通用的算法,在理解问题并分析了各种情况后,你应该设法编写算法。思考输入数据的形式,数据大小,边缘情况等,有时候您甚至可以将问题转化为更易于解决的问题,这有助于设计出更高效的算法。

  4. 伪代码:在着手编写代码之前,你需要把你的思路转化到伪代码中,这是检查以及检查你是否理解问题的关键点。写伪代码可以帮助你确保你的思路没有问题,并且更好的由思路转化到代码实现中。

  5. 编写代码:现在,你可以使用您的程序设计语言将算法转化为实际代码。

  6. 测试:测试您的代码,并确保它是正确的。处理程序的各类边界案例和一般情况, 尤其留意输入中的数据结构,错误输入会严重影响算法的表现。

  7. 优化:你可以通过调整算法,优化数据结构,处理问题等来进一步优化您的代码。
    通过以上步骤严谨的处理每道题,可以使你更高效地解决算法问题。


我应该克服总是不敢声明变量的问题


声明变量是编程中一个很重要的环节,在适当的时候合适地声明变量可以大大提高代码的可读性,理解性以及代码的可维护性。但是,过度声明变量会让代码变得冗长,难以理解,调试困难,运行性能也会受到影响。

为了克服总是不敢声明变量的问题,你可以尝试从以下几个方面入手:

  1. 养成良好的编程习惯和规范,尽量使用规范的变量命名,这样可以让你更加清晰地记住每个变量的含义和作用。

  2. 熟练掌握常用的数据结构和算法,这样可以帮助你更加清晰地思考问题,减少过多的变量声明。

3.** 在做题时,不要过分追求代码的简洁,要以理解代码和算法为目标**,增加适当的注释可以帮助你更好地理解代码意图。

  1. 不要过于害怕出错,在尝试练习时,可以多写几个练手的小例子,加深对变量命名和声明的理解。

总之,克服不敢声明变量的问题需要勇气和实践,在实践中不断总结和纠正,才能够提高代码的质量和效率。

对于记忆和复习,人们有不同的方法和喜好。

以下是一些可能有用的方法供参考:

  1. 练习:通过多次的练习,您可以加深对代码的理解和记忆,并提高对该代码片段的掌握程度。
  2. 反复阅读:重复阅读代码片段并多次思考其实现过程和解决问题的思路,有助于您牢固地掌握它。
  3. 总结笔记:将代码中的重要信息和关键点用语言文字表达出来,相当于将知识点重新组合一遍、加工一遍。这样有利于您更深入的了解和记忆。
  4. 理解思路:不仅要可以手写打出代码片段,还要根据这些代码片段归纳总结出一套适合自己的思路和模式,这样可以在不断地积累和尝试中提升自己的编程水平。

不同的方法要根据实际情况自行选择,同时要加强练习和总结,以便将学到的知识更好地应用到实际工作中。

posted @ 2023-03-19 14:18  专心Coding的程侠  阅读(20)  评论(0编辑  收藏  举报