每个程序员都应该知道的8大算法

这篇具有很好参考价值的文章主要介绍了每个程序员都应该知道的8大算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在编程开发中,算法是用于解决特定问题或完成特定任务的一组指令或过程。算法可以用任何编程语言表示,可以像一系列基本操作一样简单,也可以像涉及不同数据结构和逻辑的多步骤过程一样复杂。

算法的主要目标是接收输入、处理它并提供预期的输出。算法可以根据时间和空间复杂性、用于解决问题的技术以及解决问题的类型进行分类。算法的例子有排序、搜索、图形遍历、字符串操作、数学运算等等。

这些算法广泛用于各种应用程序,程序员对它们有深刻的理解很重要,所以我会尽力解释它们。

我们将要讨论的8大算法如下:

1、排序算法:

1).Quicksort:

Quicksort 是一种分而治之的算法,它从数组中选择一个“主元”元素,然后根据其他元素是小于还是大于主元将它们分成两个子数组。然后对子数组进行递归排序。

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

print(quicksort([3,6,8,10,1,2,1]))

2).归并排序:

归并排序算法是一种分而治之的算法,它将一个数组一分为二,对两半进行排序,然后将它们归并在一起。

def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)

def merge(left, right):
    result = []
    i = 0
    j = 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result
print(merge_sort([3,6,8,10,1,2,1]))

3).堆排序:

堆排序算法是一种基于比较的排序算法,它将输入元素构建一个堆,然后从堆中反复提取最大元素,并将其放在排序后的输出数组的末尾。

def heap_sort(arr):
    n = len(arr)
    for i in range(n, -1, -1):
        heapify(arr, n, i)
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)

def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2
    if l < n and arr[i] < arr[l]:
        largest = l
    if r < n and arr[largest] < arr[r]:
        largest = r
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)
print(heap_sort([3,6,8,10,1,2,1]))

2.搜索算法:

1).二分搜索:

二分搜索是一种从已排序的项目列表中查找项目的有效算法。它的工作原理是将要搜索的数组部分重复def binary_search(arr, x):

分成两半,直到找到目标值。

def binary_search(arr, x):
    low = 0
    high = len(arr) - 1
    mid = 0
    while low <= high:
        mid = (high + low) // 2
        if arr[mid] < x:
            low = mid + 1
        elif arr[mid] > x:
            high = mid - 1
        else:
            return mid
    return -1
print(binary_search([1,2,3,4,5,6,7], 4))

2).哈希表:

哈希表是一种将键映射到值的数据结构,使用哈希函数计算到桶或槽数组的索引,从中可以找到所需的值。

class HashTable:
    def __init__(self):
        self.size = 10
        self.keys = [None] * self.size
        self.values = [None] * self.size

  def put(self, key, data):
        index = self.hash_function(key)
        while self.keys[index] is not None:
            if self.keys[index] == key:
                self.values[index] = data  # update
                return
            index = (index + 1) % self.size
        self.keys[index] = key
        self.values[index] = data

    def get(self, key):
        index = self.hash_function(key)
        while self.keys[index] is not None:
            if self.keys[index] == key:
                return self.values[index]
            index = (index + 1) % self.size
        return None

    def hash_function(self, key):
        sum = 0
        for pos in range(len(key)):
            sum = sum + ord(key[pos])
        return sum % self.size

t = HashTable()
t.put("apple", 10)
t.put("orange", 20)
t.put("banana", 30)
print(t.get("orange"))

3.图算法:

1).Dijkstra 最短路径算法:

Dijkstra 最短路径算法是一种寻找图中节点之间最短路径的算法。

import heapq

def dijkstra(graph, start):
    heap = [(0, start)]
    visited = set()
    while heap:
        (cost, v) = heapq.heappop(heap)
        if v not in visited:
            visited.add(v)
            for u, c in graph[v].items():
                if u not in visited:
                    heapq.heappush(heap, (cost + c, u))
    return visited

graph = {
    'A': {'B': 2, 'C': 3},
    'B': {'D': 4, 'E': 5},
    'C': {'F': 6},
    'D': {'G': 7},
    'E': {'G': 8, 'H': 9},
    'F': {'H': 10},
    'G': {},
    'H': {}
}
print(dijkstra(graph, 'A'))

4.动态规划:

斐波那契数列:

斐波那契数列是可以使用动态规划解决的问题的经典示例。

def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)


print(fibonacci(10))

5.贪婪算法:

霍夫曼编码:

霍夫曼编码是一种无损数据压缩算法,它使用贪婪算法为给定的一组符号构造前缀码。

from collections import Counter, namedtuple

def huffman_encoding(data):
    """
    Generates a Huffman encoded string of the input data
    """
    # Create a frequency counter for the data
    freq_counter = Counter(data)
    # Create a namedtuple for the Huffman tree nodes
    HuffmanNode = namedtuple("HuffmanNode", ["char", "freq"])
    # Create a priority queue for the Huffman tree
    priority_queue = PriorityQueue()
    # Add all characters to the priority queue
    for char, freq in freq_counter.items():
        priority_queue.put(HuffmanNode(char, freq))
    # Combine nodes until only the root node remains
    while priority_queue.qsize() > 1:
        left_node = priority_queue.get()
        right_node = priority_queue.get()
        combined_freq = left_node.freq + right_node.freq
        combined_node = HuffmanNode(None, combined_freq)
        priority_queue.put(combined_node)
    # Generate the Huffman code for each character
    huffman_code = {}
    generate_code(priority_queue.get(), "", huffman_code)
    # Encode the input data
    encoded_data = ""
    for char in data:
        encoded_data += huffman_code[char]
    return encoded_data, huffman_code
print(huffman_encoding("aaaaabbbcccc"))

6.分治法:

归并排序:上面已经解释过了

7.回溯:

The N-Queens Problem:这是一个可以使用回溯法解决的经典问题。目标是将 N 个问题放在 NxN 的棋盘上,使得任何皇后都不能攻击任何其他皇后。

def solveNQueens(n):
    def could_place(row, col):
        # check if a queen can be placed on board[row][col]
        # check if this row is not under attack from any previous queen in that column
        for i in range(row):
            if board[i] == col or abs(board[i] - col) == abs(i - row):
                return False
        return True

def backtrack(row=0, count=0):
        for col in range(n):
            if could_place(row, col):
                board[row] = col
                if row + 1 == n:
                    count += 1
                else:
                    count = backtrack(row + 1, count)
        return count
    board = [-1 for x in range(n)]
    return backtrack()
print(solveNQueens(4))

该算法开始将皇后放置在第一行,并且对于每个放置的皇后,它检查它是否受到任何先前皇后的攻击。

如果不是,它将继续到下一行并重复该过程。如果将皇后置于受到攻击的位置,算法会回溯并尝试不同的位置。这一直持续到所有皇后都被放置在棋盘上且没有任何相互攻击。

8.随机算法:

随机快速排序:随机选择主元的快速排序算法的一种变体。

import random

def randomized_quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = random.choice(arr)
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return randomized_quicksort(left) + middle + randomized_quicksort(right)

print(randomized_quicksort([3,6,8,10,1,2,1]))

这些是每个程序员都应该熟悉的一些最常用的算法。了解这些算法与它的实现可以帮助程序员在设计和实现高效解决方案时做出更好的决策。

如有需要本文文章内容点击下载每个程序员都应该知道的8大算法文章来源地址https://www.toymoban.com/news/detail-410799.html

到了这里,关于每个程序员都应该知道的8大算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 〖程序员的自我修养 - 认知剖析篇②〗- 学习编程之前你需要知道这些

    人之所以会觉得迷茫,本质上是欠缺对自己的一个控制力、识别庞杂信息、去伪存真的独立思考与认知能力。 说明:该文属于 程序员的自我修养 专栏, 购买任意白宝书体系化专栏可加入 易编程社区, 早鸟价订阅模式除外 。 福利:加入社区的小伙伴们,除了可以获取博主

    2024年02月12日
    浏览(44)
  • 每个.NET开发都应该知道的10个.NET库

    有个.NET面试官反馈面试了一个小白,问他用过哪些.NET库,结果只回答上了几个。作为一个.NET开发者,了解一些常用的.NET库是非常重要的。本文将介绍.NET开发人员应该了解的10个常用.NET库,这些库可以帮助开发人员提高开发效率、简化开发流程,开发出优秀的.NET应用程序。

    2024年02月06日
    浏览(39)
  • 【必看】每个开发人员都应该知道的 10 个 GitHub 库

    所有这些都将为你增加价值,并帮助你成为更好的 Web 或软件开发人员,或同时成为两者。 10 个 GitHub 仓库 ================================================================================= 1. Free Programming Books GitHub🌟:183K + 提供各种不同语言的 Free Programming Books 无疑是 GitHub 上最受欢迎和好评度

    2024年04月18日
    浏览(45)
  • 每个 Web 开发人员都应该知道的 4 个 iframe 安全问题

    原文地址:4 Security Concerns with iframes Every Web Developer Should Know 原文作者:Piumi Liyana Gunawardhana 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:jaredliw 校对者:Usualminds、KimYangOfCat iframe 是 Web 开发中最古老、最简单的内容嵌入技术之一,时至今日仍被使用。然

    2024年02月09日
    浏览(45)
  • 程序员的职场,光有技术是不行的,送给每个即将工作的程序员

    又是一年五月份,大批量学计算机的学生又要涌入职场了,牛皮的已经早早找到了工作, 但不管你技术再牛,在程序员的职场,光有技术是不行的,你还要懂得一些职场的雷坑和上升技巧。 我做了二十多年程序员,踩过不少雷,今天就把我的经验分享给大家,希望你们能在

    2024年02月04日
    浏览(62)
  • 探索编程世界的宝藏:程序员必掌握的20大算法

    #程序员必须掌握哪些算法?# 在当今数字化时代,程序员们仍然需要拥有一把解决问题和优化代码的金钥匙。这些钥匙是算法,它们隐藏在计算机科学的宝藏中,等待着我们去发现和掌握。本篇博文将带你踏上一段引人入胜的探险之旅,揭开程序员必须掌握的20大算法的神秘

    2024年02月14日
    浏览(231)
  • 应该选择网络安全还是程序员?

    很长的时间我都在思考这个问题.,根据自己的经验和朋友们的讨论后得出了一些结论,网络安全 这个概念太广,我就以安服/渗透岗作为比较的对象,题主可以参考一下: 程序员: 优点: 1.薪资非常高,今年校招大厂普遍是24K*15 2.岗位多,无论大城市还是小城市遍地是岗位

    2023年04月19日
    浏览(75)
  • 不想被卷的程序员们,应该学什么?

    我真的好像感慨一下,这个世界真的给计算机应届生留活路了吗? 看着周围的同学,打算搞前端、JAVA、C、C++的,一个两个去跑去应聘。你以为是00后整治职场? 真相是主打一个卑微:现阶段以学习为主( 工资能活命就行 );学习能力强( 让我干什么都行 );能抗压( 加

    2024年02月12日
    浏览(44)
  • 程序员必须掌握哪些算法?——前端开发工程师需要掌握的算法

    一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。作为一名前端开发工程师,今天就通过这个话题和文章来聊聊前端开发工程师需要掌握的算法有哪些呢。 算法(Algorithm) 是指解题方案的准确而完整的

    2024年02月15日
    浏览(73)
  • 当前就业环境下,程序员应该自降薪资应聘吗?

    最近就业环境不好,有些人为了找到工作,主动降低薪资要求,甚至有些人主动提出比企业招聘工资更低的工资以求入职,这样做合适吗? 其实这个问题早些年也经常被人提及,主要针对的是新进入就业市场的培训班学员,对他们而言,能用一个较低的薪资进入行业,以后再

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包