データ構造とアルゴリズムの紹介

Javaプログラマ、アルゴリズムとデータ構造の場合、通常はこの事を仕事と多くを行います。私の直接の上司とあそこの会社のインターンシップに読み込むときアルゴリズムが重要ではないことを私に言った、非常に少しを使用しています。おそらく、それが真実である、と今2年卒業した、関連するアルゴリズムとデータ構造の内容は確かに非常に小さかったです。しかし、私は、データ構造とアルゴリズムは、プログラマの基本的なスキルだと思い、プログラマは、知識のレベルを区別することができますので、私は体系的に共通のデータ構造とアルゴリズムの下で整理したいです。

1.データ構造とは何ですか

研究データ構造は、データの論理構造、ストレージ構造と規律関連の操作(追加、削除、変更および検索)です。
:データ構造は、論理構造の4つの基本型があり、ストレージ構造及び論理構造に分割されてもよい図の構造のような線状構造のセット、ツリー構造は、。

  • コレクション構造:1つのタイプに属する同じ、ない他の関係に加えて。
  • 線形構造:1人の関係が要素間に存在します。一般的なタイプは次のとおりです。**配列、リンクリスト、キュー、スタック、*。それらの間の動作が異なります。たとえば、次のリストは、任意の位置、または削除する要素に挿入することができ、テール要素が挿入され、削除されたキューのヘッド素子のキュー、スタックは、スタックの最上部、削除操作に挿入することができます。
  • ツリー構造:要素間の多くの関係。一般的なタイプは次のとおりです。ツリー(多くの例外があります:バイナリツリー、平衡二分木、探索木など)
  • グラフ構造は:多くの関係が存在し、ノードの前駆グラフ構造と、複数のノードの各ノードは、後続の要素間の任意の数であってもよいです。

コンピュータで表される構造の形でデータを記憶し、記憶構造体の次の4つの種類があります

  • 順次記憶構造:順次メモリセルに連続したアドレスに格納されたデータ構造を記憶します。
  • リンク・ストレージ構造:リンクされたストレージ構造のアドレスを格納することにより、関連するデータ要素を見つけ、任意のメモリセルにデータを格納します。
  • インデックスの格納構造;(便利なクエリ)
  • ハッシュストレージ構造;(便利なクエリ)

2.アルゴリズムとは何ですか

プログラムは、データ構造及びアルゴリズム、及び(と理解することができるプログラム+データ構造=アルゴリズム)。入力、出力、有限、確実性と実現可能性:アルゴリズムは、5つの基本的な機能を備えていなければなりません。

  • 输入:一个算法具有零个或者多个输出。以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件。后面一句话翻译过来就是,如果一个算法本身给出了初始条件,那么可以没有输出;
  • 输出:算法至少有一个输出。也就是说,算法一定要有输出。输出的形式可以是打印,也可以使返回一个值或者多个值等。也可以是显示某些提示。
  • 有穷性:算法的执行步骤是有限的,算法的执行时间也是有限的。
  • 确定性:算法的每个步骤都有确定的含义,不会出现二义性。
  • 可行性:算法是可用的,也就是能够解决当前问题。

在开始之前先普及下算法复杂度的相关概念。计算机能够根据我们给出的算法完成实现相应的功能,但是要想编写出能高效运行的程序,我们就需要考虑到算法的效率。算法的效率主要由以下两个复杂度来评估:

  • 时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。
  • 空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。
  • 正确性:算法对于合法数据能够得到满足要求的结果,能够处理非法输入,并得到合理的结果。
  • 可读性:算法要便于阅读、理解和交流
  • 健壮性:算法不应该得到莫名其妙的结果
  • 性价比:利用最少的资源得到满足要求的结果

设计算法时,一般是要先考虑系统环境,然后权衡时间复杂度和空间复杂度,选取一个平衡点。不过,时间复杂度要比空间复杂度更容易产生问题,因此算法研究的主要也是时间复杂度,不特别说明的情况下,复杂度就是指时间复杂度。

时间复杂度
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。

前面提到的时间频度T(n)中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律,为此我们引入时间复杂度的概念。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),它称为算法的渐进时间复杂度,简称时间复杂度。更详细介绍参考博客

O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2ⁿ) < O(n!)

空间复杂度
算法在执行过程中除了输入输出参数占用的空间之外,还需要多少辅助空间。这些辅助空间称为算法的空间复杂度。

算法空间复杂度是算法运行后对空间需求量的定性描述。通常使用S(n)表示算法的空间复杂度。使用时间复杂度的推导方法推导空间复杂度。当算法所需的内存空间大小为常数时,算法的空间复杂度为S(1)。通常情况下,算法的时间复杂度更受关注。可以通过增加额外空间降低时间复杂度。算法是解决具体问题的步骤,数据结构是算法解决问题的载体。

常见的算法

  • 图搜索 (广度优先、深度优先)深度优先特别重要
  • 排序
  • 动态规划
  • 匹配算法和网络流算法
  • 正则表达式和字符串匹配
  • 三路划分-快速排序
  • 合并排序(更具扩展性,复杂度类似快速排序)
  • DF/BF 搜索 (要知道使用场景)
  • Prim / Kruskal (最小生成树)
  • Dijkstra (最短路径算法)
  • 选择算法

3. 一句话总结

算法是解决具体问题的步骤,数据结构是算法解决问题的载体。

4. 参考

おすすめ

転載: www.cnblogs.com/54chensongxia/p/11448695.html