范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

经典算法解析Part1

  经典算法有很多,这里罗列一些比较常用的算法:
  1.排序算法:冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort)希尔排序(Shell Sort)归并排序(Merge Sort)快速排序(Quick Sort)堆排序(Heap Sort)计数排序(Counting Sort)桶排序(Bucket Sort)基数排序(Radix Sort)
  2.查找算法:线性查找(Linear Search)二分查找(Binary Search)哈希查找(Hash Search)平衡树查找(AVL Tree、B-Tree)
  3.图算法:深度优先搜索算法(Depth First Search)广度优先搜索算法(Breadth First Search)最短路径算法Dijkstra 算法Bellman-Ford 算法Floyd-Warshall 算法最小生成树算法Prim 算法Kruskal 算法
  4.字符串匹配算法:暴力匹配算法(Brute Force)KMP 算法BM 算法
  以上算法只是部分经典算法,并不是全部,但它们在各自领域都拥有着广泛的应用。
  在很早之前我的排序算法专项中,已经解析了10大排序算法。本篇我们为你讲解经典查找算法。线性查找
  线性查找是一种简单的查找算法,适用于无序数组或链表等数据结构。它遍历待查找的数据结构,逐个检查每个元素是否匹配目标值,直到找到目标值或者遍历完整个数据结构。
  下面是使用Java实现线性查找的示例代码:public class LinearSearch {      public static int linearSearch(int[] arr, int target) {         for (int i = 0; i < arr.length; i++) {             if (arr[i] == target) {                 return i;             }         }         return -1;     }      public static void main(String[] args) {         int[] arr = {10, 20, 30, 40, 50};         int target = 30;         int result = linearSearch(arr, target);         if (result == -1) {             System.out.println("Element is not present in array");         } else {             System.out.println("Element is present at index " + result);         }     } }
  这段代码定义了一个名为LinearSearch的类,其中包含一个静态方法linearSearch和一个main方法。linearSearch方法接收一个整型数组和一个目标值,返回目标值在数组中的索引位置。如果目标值不在数组中,则返回-1。
  在main方法中,我们创建了一个整型数组arr和一个目标值target,并将它们传递给linearSearch方法进行查找。最后,根据返回值,打印出相应的结果。
  线性查找的时间复杂度是O(n),其中n是数组或链表元素的数量。对于大型数据结构,使用线性查找可能会非常耗时,因此需要使用其他更高效的算法。二分查找
  二分查找是一种高效的查找算法,它要求被查找的数组元素必须是有序的。具体实现过程如下:首先确定查找范围的起始点和终止点。将数组从中间划分成两部分,判断目标值与中间值的大小关系。如果目标值等于中间值,则查找成功。如果目标值小于中间值,则在数组前半部分进行查找,并将查找范围终止点移动到中间位置的前一个位置。如果目标值大于中间值,则在数组后半部分进行查找,并将查找范围起始点移动到中间位置的后一个位置。重复上述步骤,直到查找到目标值或者查找范围缩小为0。
  下面是Java实现代码:public static int binarySearch(int[] arr, int target) {     int lo = 0;     int hi = arr.length - 1;          while (lo <= hi) {         int mid = lo + (hi - lo) / 2;         if (arr[mid] == target) {             return mid;         } else if (arr[mid] < target) {             lo = mid + 1;         } else {             hi = mid - 1;         }     }          return -1; // target not found }
  在这个实现中,变量lo表示查找范围的起始点,变量hi表示查找范围的终止点。如果目标值在此范围内,则将此范围缩小为[mid + 1, hi]或[lo, mid - 1]。
  这个算法的时间复杂度是O(log n),因为每次比较都将查找范围缩小一半。哈希查找
  哈希查找(Hash table lookup or Hash search)又称散列查找,是根据键值(Key value)而直接进行访问的一种数据查找技术。哈希函数将关键字映射到存储位置来访问记录,加快了查找速度。哈希表由关键码值(Key value)映射成表中一个位置的记录(Redirect Addressable Memory)。支持常数级平均查找时间,哈希表在数据库搜索、缓存等领域有着广泛的应用。
  基本思想:通过把关键码值映射到表中一个位置来查找记录,以加快查找的速度。哈希函数和冲突处理方法是哈希技术的关键。
  实现步骤:
  1.设计哈希函数,并初始化一个数组大小为m的散列表。注意哈希函数需要满足如下特性:一致性:若a=b,则hash(a)=hash(b)高效性:计算简单,且易于解析均匀分布性:各个元素被哈希分到各个槽的概率应该相等
  2.插入元素根据哈希函数值,得到散列表中哈希桶的地址向该哈希桶中插入元素
  3.查找元素根据哈希函数值,得到散列表中哈希桶的地址在该哈希桶中遍历查找指定的元素
  Java实现:public class HashSearch {     private int size;     private List[] hashtable;      public HashSearch() {         this.size = 1000; // 散列表大小为1000         this.hashtable = new ArrayList[this.size];          for (int i = 0; i < this.size; i++) {             this.hashtable[i] = new ArrayList<>();         }     }      // 哈希函数,使用除留余数法     private int hash(int key) {         return key % this.size;     }      // 插入元素     public void insert(int key) {         int hashKey = hash(key);         List list = this.hashtable[hashKey];         list.add(key);     }      // 查找元素     public boolean search(int key) {         int hashKey = hash(key);         List list = this.hashtable[hashKey];          // 判断元素是否在哈希桶中         return list.contains(key);     } }
  哈希查找算法的时间复杂度通常为O(1),因为它使用散列函数直接定位元素所存储的位置。但在一些极端情况下,哈希函数可能会产生哈希碰撞,这将导致查找、插入和删除操作的性能降低到O(n)。因此,在选择哈希函数时需要谨慎,并估计哈希表大小来减少哈希冲突的可能性。平衡树查找
  平衡树是一种基于二叉树的查找算法,主要目的是为了解决普通二叉搜索树在极端情况下会退化成链表的问题。常见的平衡树有红黑树、AVL树、Treap、伸展树等。
  这里以红黑树为例来讲解并使用Java实现平衡树查找算法。
  红黑树简介
  红黑树(Red-Black Tree)是一种自平衡的二叉查找树,每个节点上的额外信息包括节点颜色和子树大小等。通过遵循如下规则保持二叉查找树的整体高度始终为 O(log n) 每个节点要么是红色,要么是黑色 根节点是黑色 叶子节点是黑色 如果一个节点是红色,则它的左右子节点必须都是黑色 从任意一个节点到其每个叶子节点的所有路径都包含相同数目的黑色节点
  插入和删除一个节点的时间复杂度均为 O(log n),查询的时间复杂度也是 O(log n)
  Java实现红黑树代码如下:public class RedBlackTree> {     private static final boolean RED   = true;     private static final boolean BLACK = false;      private Node root;      private static class Node {         T key;         Node left, right;         int size;         boolean color;         Node(T key, int size, boolean color) {             this.key = key;             this.size = size;             this.color = color;         }     }      private void flipColor(Node x) {         x.color = !x.color;         x.left.color = !x.left.color;         x.right.color = !x.right.color;     }      private Node rotateLeft(Node h) {         Node x = h.right;         h.right = x.left;         x.left = h;         x.color = h.color;         h.color = RED;         x.size = h.size;         h.size = 1 + size(h.left) + size(h.right);         return x;     }      private Node rotateRight(Node h) {         Node x = h.left;         h.left = x.right;         x.right = h;         x.color = h.color;         h.color = RED;         x.size = h.size;         h.size = 1 + size(h.left) + size(h.right);         return x;     }      private boolean isRed(Node x) {         if (x == null) return false;         return x.color == RED;     }      private int size(Node x) {         if (x == null) return 0;         return x.size;     }      public boolean contains(T key) {         return contains(root, key);     }      private boolean contains(Node x, T key) {         while (x != null) {             int cmp = key.compareTo(x.key);             if      (cmp < 0) x = x.left;             else if (cmp > 0) x = x.right;             else              return true;         }         return false;     }      public void put(T key) {         root = put(root, key);         root.color = BLACK;     }      private Node put(Node h, T key) {         if (h == null) return new Node<>(key, 1, RED);          int cmp = key.compareTo(h.key);         if      (cmp < 0) h.left  = put(h.left,  key);         else if (cmp > 0) h.right = put(h.right, key);         else              ;  // The Key already exist in the tree.          if (isRed(h.right) && !isRed(h.left))      h = rotateLeft(h);         if (isRed(h.left)  && isRed(h.left.left))  h = rotateRight(h);         if (isRed(h.left)  && isRed(h.right))     flipColor(h);          h.size = size(h.left) + size(h.right) + 1;          return h;     } }

独特吸睛,看厌了基础款,那就来试试这些款式特别的开衫吧,附图解BY金鱼随着气温的下降,我们的衣衣们也开始进入了加厚模式,衣橱里一些比较单薄的服装,也逐渐退休,小编这里的气温忽高忽低,开衫成了百搭且实用的超强穿搭必备单品。看惯了基础款与简约大方2022年取暖补贴,价格补贴和社保补贴正在发放中,哪些人能享受?视频加载中眼下已经进入2022年最后一个季度,不过让很多人欣喜的是,自2022年10月起,社会保险待遇就频频传出利好消息,其中就包括部分退休人员养老待遇重新核定并补发差额,过渡性养LOL大乱斗改动引热议!远程英雄伤害大幅度降低,最高削减30伤害相信兄弟们都已经听说了,英雄联盟热门模式大乱斗即将迎来针对性改版,所涉及到的改动可能会影响整个大乱斗的格局,尤其是传送门和对远程技能的削弱这两个改动尤为明显,对此每个大乱斗爱好者的关于新生儿的冷知识你都了解哪些?新手妈妈必看新生儿是指未满周岁之前的宝宝,作为一个孩子一生中蕞重要的时期之一,婴儿阶段宝宝的各项身体素质都处于很低的状态,但是一些新手爸爸妈妈不太懂里面的套路,就有了这些啼笑皆非的冷知识。1。油耗1。1L,高质量大空间,丰田混动高配家用SUV,RAV4荣放双擎E如果经常需要上高速外出,又想要新能源汽车,上个绿牌什么的,并不推荐纯电动汽车,第一是充电桩还是太少,其次充电时间最快也得半小时,甚至更长。不如退而求其次,选择插电式混合动力汽车,油想买一台小电驴,没事上班骑?盘点电动车品牌,附爆款清单本内容来源于什么值得买APP,观点仅代表作者本人作者享识慧大家好我是享识慧电动车市场在我国还是非常庞大的。市面上的品牌也特别的多。功能和质量都参差不齐。电动车作为一类交通工具,安全我的月子病(上)一说月子病,相信很多人会摇头不承认,曾几何时我也是看客,然而不幸的是我真的得了严重的月子病。很多西医专家这样说其实正规的医学教材和研究文献是找不到月子病的,所谓月子病往往是因为孕期应该没有人不知道吧?独身子女和二胎家庭的区别,不到20年就可以看出前段时间,父亲过60大寿,家里来了很多亲戚朋友,我跟老公也被他们轮番上阵催生二胎。现在搞得我都有点怕过年了,每次一催我都头疼,不生二胎这些玩具千万不要给孩子买,有的赶紧丢掉玩具在儿童的成长中起着潜移默化的启蒙教育作用,是孩子们的最爱。但儿童玩具的安全性能直接关乎到儿童的安全和健康,有资料表明粗制滥造的玩具产品成为了孩子们的头号隐形杀手,下面这些玩具最意外怀孕了,怎么办?现在有一些年轻人,还没有做好为人母和为人父的准备,甚至连结婚都没有,在同房的时候没有采取一定的措施,结果得知意外怀孕了。无非就是两种结果,第一种就是把孩子做掉,第二种就是匆忙结婚把培养情商要趁早,6本经典绘本提升孩子情商!赶快为孩子收藏起来孩子从一出生就是独立的个体,他们会面临各种各样的情绪,不同年龄段孩子的情绪表现和对情绪的感知态度是不一样的,家长们不能忽略孩子成长中的情绪表现。如何让孩子学会管理自己的情绪,更好地
罗家英和汪明荃阳康之后参加穆念慈女儿的婚礼,容光焕发罗家英早前与太太汪明荃去日本旅行以后确诊了新冠,5天之后由阳转阴,而太太汪明荃也已经痊愈了,他最近去参加了杨盼盼女儿的婚礼,这可真是阳康之后去找了穆念慈,看上去非常的有戏剧性。这是Switch游戏推荐2022年2022switch游戏推荐Switch游戏推荐1。马里奥赛车8Deluxe马里奥赛车8Deluxe是一款经典的赛车竞速游戏,它支持单机和多人游戏模式,玩家可以选择各种不同的赛车来腾讯集结27军围殴原神?开放世界的乱纪元开启!作者碧海银鲨现在行业里是个人都知道腾讯错过了米哈游的投资,悔得估计肠子都青了。但许多人不知道的是,在原神掀起开放世界热潮后,腾讯爆兵般的集结了27款开放世界游戏来对抗米哈游的进攻,像素风末日生存游戏洋流朋克1月12日Steam发售定价28元由单人工作室InfiniteStudio制作益时光工作室发行的末日模拟生存游戏洋流朋克抢先体验版1月12日1600在Steam发售,游戏定价28元,首周开启9折优惠。洋流朋克背景设布隆怎么玩?团队堡垒!强力辅助守护神头条创作挑战赛技能介绍被动震荡猛击通过普通攻击和寒冬之咬来对目标施加标记。在施加第一层标记后,我方英雄的普攻也会叠加此标记。当目标身上的此标记达到4层,就会陷入晕眩1秒并承受32魔哆啦A梦预言成真,老外开始晒穿越自拍了狂丸研究所,每天涨点新知识穿越回一些历史中的名场面,然后来张自拍是什么感觉?这听起来或许只有哆啦A梦的道具可以办到,例如时光机或者快速旅行相机,前者可以让你穿梭时空,后者则能直接把小明或离开RNG?LPL爆料人放出消息,金牌辅助面临抉择时间来到1月12日,转眼LPLLCK季前启航赛早已落下帷幕,接下来等待着LOL召唤师的,便是2023LPLLCK春季赛,其中LCK春季赛在1月18日正式开打,手握召唤师杯的世界冠军从主播安若蓝的手法中寻找最佳战利品最佳地点(PUBG战利品指南)知道安若蓝这名主播也是因为她和小海四排,安若蓝是带妹狂魔小海带的众多妹子之一。看安若蓝直播是一种享受,她的枪法虽然一般,但是声音是真的好听,女神音那种,很多人送她礼物就是为了听她念男性也可以了解女性的这些健康知识一女性都会来大姨妈,也就是月经其实没有那么多的月经不规律,不要因为这个月大姨妈没有准时来,就担心自己月经不调了。正常的月经周期是21到35天,月经一般会来三到七天,但如果每次都固定转阴之后,实在是想喝酒,千万要牢记2不碰,健康过新年因为我们现在已经放开了,阳的人变得越来越多,但是经过一段时间之后,转阴的人也开始多了起来,网络上对于转阴初期的注意事项其实已经说了很多了,甚至于有的人再转阴之后都不能洗澡。也有的人不要吃水果?从今天起记录我的2023不是不要吃水果,而是不要吃那么多水果。的确,水果中含有较多碳水化合物膳食纤维维生素矿物质等营养成分。也成了我们每一个家庭里必不可少的一样食物。就拿我自己来说