使用Python和C++的写数据结构和算法

简介: 使用Python和C++的写数据结构和算法

数据结构和算法是计算机科学的主题,无论您对编程的哪个方面感兴趣,每个程序员都应该知道。人们相信,如果你对数据结构和算法有很好的了解,那么你就知道设计算法和编写好代码的基础。这就是为什么编码面试中的大多数问题都基于数据结构和算法的概念。在本文中,我将带您完成关于使用Python和C++编程语言写数据结构和算法。


1.数据结构和算法简介


数据结构可以定义为用于存储和组织数据的元素,算法可以定义为解决问题所需的一系列步骤。数据结构和算法的概念有助于我们有效和高效地解决问题。


通过实现数据结构的概念,创建了一种良好的算法,使算法能够有效地管理数据。在任何计算机科学任务中,我们都需要了解数据结构和算法的概念,以设计更好的算法来解决复杂问题。在下一节中,我将带您了解一些您应该知道的最重要的数据结构和算法:


2.数据结构


2.1 堆栈


堆栈是几乎所有编程语言中常用的抽象数据类型。堆栈是一种模拟现实世界堆栈的数据结构,如卡片、盘子堆栈等。以下是如何使用Python实现堆栈的方法:


class Stack:
    def __init__(self):
        self.items = []
    def is_empty(self):
        return self.items == []
    def push(self, item):
        self.items.append(item)
    def pop(self):
        return self.items.pop()
    def peek(self):
        l = len(self.items)-1
        return self.items[l]
    def size(self):
        return len(self.items)


2.2 队列


队列是一种数据结构,我们从后面插入项目,然后从前面删除项目。它遵循先入先出的数据结构原则。您可以将Queues数据结构想象成排队等待购买演出门票的人。在这里,第一个排队的人是第一个买第一张票的人,依此类推。因此,我们可以说,计算机科学中的队列数据结构模拟了实际队列。以下是如何使用Python实现队列的方法:


class queue:
    def __init__(self):
        self.items = []
    def is_empty(self):
        return self.items == []
    def enqueue(self, item):
        self.items.insert(0, item)
    def dequeue(self):
        return self.items.pop()
    def size(self):
        return len(self.items)


2.3 散列表


散列表就像Python中的字典,它们是数据结构,用于以键和值格式存储和检索大量数据。散列表基于散列的概念,它提供了一种在复杂的时间和空间中高效存储和检索数据的方法。以下是如何使用Python实现散列表的方法:


class hashtable:
    def __init__(self, items):
        self.bucket_size = len(items)
        self.buckets = [[] for i in range(self.bucket_size)]
        self.assign_buckets(items)
    def assign_buckets(self, items):
        for key, value in elements:
            hash_value = hash(key)
            index = hash_value % self.bucket_size
            self.buckets[index].append((key, value))
    def get_value(self, input_keys):
        hash_value = hash(input_keys)
        index = hash_value % self.bucket_size
        bucket = self.buckets[index]
        for key, value in bucket:
            if key == input_keys:
                return(value)


2.4 二叉树


二叉树是一种通用而强大的数据结构,看起来像一棵真正的树。它包含连接图中的节点,其中每个节点都有一个父节点和一个按特定顺序的子节点。二叉树由节点组成,每个节点都包含一个左右指针和一个数据项。它还有一个指向树中最顶部节点的根指针。左右指针指向两侧的小子树。它还有一个空树,代表一个没有元素的二叉树。以下是如何使用C++实现二叉树的方法:


#include <iostream>
using namespace std;
typedef struct binary_tree_node{
    int v;
    struct binary_tree_node *left;
    struct binary_tree_node *right;
}
BTNode;
BTNode *create_binary_tree_node(int v){
    BTNode *p = new BTNode;
    if(p != NULL){
        p->v = v;
        p->left = NULL;
        p->right = NULL;
    }
    return p;
}
void create_balanced_bin_tree(BTNode **root, int arr[], int start, int end){
    if(start <= end){
        int mid = (start + end + 1) / 2;
        *root = create_binary_tree_node(arr[mid]);   
        create_balanced_bin_tree(&((*root)->left), arr, start, mid - 1);
        create_balanced_bin_tree(&((*root)->right), arr, mid + 1, end);
    }
}
void print_binary_tree(BTNode *root){
    if(root != NULL){
        cout << root->v;
        print_binary_tree(root->left);
        cout << endl;
        print_binary_tree(root->right);
        cout << endl;
    }
}
int main(int argc, char* argv[])
{
    int arr[30];
    for(int i = 0; i < 30; i ++){
        arr[i] = i;
    }
    BTNode *root = NULL;
    create_balanced_bin_tree(&root, arr, 0, 29);
    print_binary_tree(root);
return 0;
}


2.5 线性搜索


线性搜索是最基本和最有用的算法之一,它通过数据结构依次移动以找到相应的值,这就是它也被称为顺序搜索算法的原因。将线性搜索算法视为通过智能手机上的联系人列表找到方法。线性搜索从开始,从阅读每个名字开始,直到你找到你要找的东西。以下是如何使用Python实现线性搜索或顺序搜索的方法:


def sequential_search(list_, n):
    for i in list_:
        if i == n:
            break
    return True


2.6 二进制搜索


二元搜索也称为半间隔搜索,是一种用于计算机系统查找值在排序数组中位置的算法。在二进制搜索算法中,列表被拆分为两半,然后在每半中搜索。在实现二进制搜索算法时,需要注意的一件事是,在运行算法之前,必须对列表进行排序。以下是如何使用Python实现二进制搜索的方法:


def search(list, n):
    l = 0
    u = len(list) - 1
    while 1 <= u:
        mid = (l + u) // 2
        if list[mid] == n:
            return True
        else:
            if list[mid] < n:
                l = mid + 1
            else:
                u = mid - 1
    return False
list = [1, 3, 4, 7, 8, 9, 10, 45, 50, 90, 100, 150, 600, 1000]
n = 90
if search(list, n):
    print("Found")
else:
    print("Not Found")


2.7 递归


在编程中,递归是对同一方法的方法调用。换句话说,递归方法是自称为的方法。在递归中,您唯一的任务是简化原始问题,或在简化没有必要或不可能时直接解决。以下是如何使用C++实现递归的方法:


int get_term_fib(int n){
  if (n == 0)
    return 0;
  if (n == 1)
    return 1;
  return get_term_fib(n - 1) + get_term_fib(n - 2);
}


2.8 递归二进制搜索


递归是指通过将复杂问题分解为更小的问题,然后逐步解决问题来解决问题。二进制搜索意味着通过反复将搜索间隔分为两半来查找排序数组中的项目,递归二进制搜索意味着将整个二进制搜索过程细分为较小的问题。简而言之,二进制搜索的递归解决方案称为递归二进制搜索。以下是如何使用Python实现递归二进制搜索的方法:


def rec_binarySearch(target, sequence, first, last):
    if first > last:
        return False
    else:
        mid = (last + first) // 2
        if sequence[mid] == target:
            return True
        elif target < sequence[mid]:
            return rec_binarySearch(target, sequence, first, mid-1)
        else:
            return rec_binarySearch(target, sequence, mid + 1, last)


2.9 QuickSort


快速排序是一种排序算法,它选择一个项目并重新排列数组,形成两个分区,以便项目下方的所有项目都先出现,上面的所有项目之后。然后,该算法递归用于各个部分,直到它获得排序列表。以下是如何使用C++实现快速排序算法的方法:


#include<iostream>
using namespace std;
void swap(int arr[], int i, int j){
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
int partition(int arr[], int l, int r){
    int pivot = arr[r];
    int i = l - 1;
    for(int j = l; j < r; j++){
        if(arr[j] < pivot){
            i++
            swap(arr, i, j);
        }
    }
    swap(arr, i + 1, r);
    return i+1;
}
void quicksort(int arr[], int l, int r){
    if(l < r){
        int pi = partition(arr, l, r);
        quicksort(arr, l, pi-1);
        quicksort(arr, pi+1, r);
    }
}
int main(){
    int arr[5]={5, 4, 3, 2, 1};
    quicksort(arr, 0, 4);
    for(int i=0; i<5; i++){
        cout<<arr[i]<<" ";
    }cout<<endl;
    return 0;
}


2.10 Fizzzbuzz算法


FizzBuzz算法是编码面试中最喜欢的问题之一。Fizz和Buzz是指3和5的倍数。这个编码问题在数字3和5中很受欢迎,但您可能可以看到更复杂的数字,但解决这个问题的逻辑将保持不变。以下是如何使用C++实现fizzbuzz算法的方法:


#include<iostream>
using namespace std;
int main(){
    for(int i = 1; i<=20; i++){
        if(i % 3 == 0 && i % 5 == 0){
            cout<<"FizzBuzz"<<endl;
        }
        else if(i % 3 == 0){
            cout<<"Fizz"<<endl;
        }
        else if(i % 5 == 0){
            cout<<"Buzz"<<endl;
        }
        else{
            cout<<i<<endl;
        }
    }
    return 0;
}


2.11 计数排序


计数排序的时间复杂性优于其他排序技术。计数排序算法的工作原理是查找数组中每个唯一元素的数量。然后计算每个元素在排序数组中的位置。计数排序的唯一限制是它仅限于小正整数。以下是如何使用C++实现计数排序算法的方法:


#include<iostream>
using namespace std;
void countsort(int arr[], int n){
    int k = arr[0];
    for(int i = 0; i < n; i++){
        k = max(k, arr[i]);
    }
    int count[k] = {0};
    for(int i = 0; i < n; i++){
        count[arr[i]]++;
    }
    for(int i = 1; i <= k; i++){
        count[i]+=count[i-1];
    }
    int output[n];
    for(int i=n-1; i>=0; i--){
        output[--count[arr[i]]] = arr[i];
    }
    for(int i=0; i<n; i++){
        arr[i] = output[i];
    }
}
int main(){
    int arr[] = {1, 3, 2, 3, 4, 1, 6, 4, 3};
    countsort(arr, 9);
    for(int i=0; i<9; i++){
        cout<<arr[i]<<" ";
    }
    return 0;
}


2.12 合并排序


合并排序是基于分而治之技术的排序算法。它的工作原理是将数组分为两半,然后以排序方式组合它们。合并排序是一种整洁的算法,因为它是排序自己的排序。这意味着按合并排序只需要很少的比较和交换;相反,它依赖于一种与快速排序略有不同的分而分赢策略。以下是如何使用C++实现合并排序的方法:


#include<iostream>
using namespace std;
void merge(int arr[], int l, int mid, int r){
    int n1 = mid - l + 1;
    int n2 = r - mid;
    int a[n1];
    int b[n2];
    for (int i = 0; i < n1; i++){
        a[i] = arr[l + i];
    }
    for (int i = 0; i < n2; i++){
        b[i] = arr[mid + 1 + i];
    }
    int i = 0;
    int j = 0;
    int k = 1;
    while (i < n1 && j < n2){
        if (a[i] < b[j]){
            arr[k] = a[i];
            k++; i++;
        }
        else{
            arr[k] = b[j];
            k++; j++;
        }
    }
    while (i < n1){
        arr[k] = a[i];
        k++; i++;
    }
    while (j < n2){
        arr[k] = b[j];
        k++; j++;
    }
}
void mergeSort(int arr[], int l, int r){
    if (l < r){
        int mid = (l + r) / 2;
        mergeSort(arr, l, mid);
        mergeSort(arr, mid + 1, r);
        merge(arr, l, mid, r);
    }
}
int main(){
    int arr[]={5, 4, 3, 2, 1};
    mergeSort(arr, 0, 4);
    for(int i=0; i<5; i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    return 0;
}


2.13 插入排序


插入排序算法维护排序项的集合和要排序的项目集合。在程序中实现插入排序时,该算法将排序和未排序的集合保持在同一序列结构中。以下是如何使用C++实现插入排序算法的方法:


#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int arr[n];
    for(int i = 0; i < n; i ++){
        cin>>arr[i];
    }
    for(int i = 1; i < n; i++){
        int current = arr[i];
        int j = i - 1;
        while (arr[j]>current && j >= 0){
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = current;
    }
    for(int i = 0; i < n; i++){
        cout<<arr[i]<<" ";
    }cout<<endl;
}


2.14 选择排序


选择排序是一种排序算法,特别是就地比较排序。该算法将输入数组分为两部分:已在数组开始(左)从左到右构建的已排序项子列表,以及占据数组其余部分的剩余待排序项子数组。以下是如何使用C++实现选择排序算法的方法:


#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int arr[n];
    for (int i = 0; i < n; i++){
        cin>>arr[i];
    }
    for (int i = 0; i < n; i++){
        for (int j = i+1; j<n; j++){
            if (arr[j] < arr[i]){
                int temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;
            }
        }
    }
    for (int i = 0; i < n; i++){
        cout<<arr[i]<<" ";
    }cout<<endl;
}



目录
打赏
0
0
0
0
31
分享
相关文章
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
本文详细讲解了在Python环境下使用大牛直播SDK实现RTMP推流的过程。从技术背景到代码实现,涵盖Python生态优势、AI视觉算法应用、RTMP稳定性及跨平台支持等内容。通过丰富功能如音频编码、视频编码、实时预览等,结合实际代码示例,为开发者提供完整指南。同时探讨C接口转换Python时的注意事项,包括数据类型映射、内存管理、回调函数等关键点。最终总结Python在RTMP推流与AI视觉算法结合中的重要性与前景,为行业应用带来便利与革新。
基于 Python 哈希表算法的员工上网管理策略研究
于当下数字化办公环境而言,员工上网管理已成为企业运营管理的关键环节。企业有必要对员工的网络访问行为予以监控,以此确保信息安全并提升工作效率。在处理员工上网管理相关数据时,适宜的数据结构与算法起着举足轻重的作用。本文将深入探究哈希表这一数据结构在员工上网管理场景中的应用,并借助 Python 代码示例展开详尽阐述。
30 3
Python下的毫秒级延迟RTSP|RTMP播放器技术探究和AI视觉算法对接
本文深入解析了基于Python实现的RTSP/RTMP播放器,探讨其代码结构、实现原理及优化策略。播放器通过大牛直播SDK提供的接口,支持低延迟播放,适用于实时监控、视频会议和智能分析等场景。文章详细介绍了播放控制、硬件解码、录像与截图功能,并分析了回调机制和UI设计。此外,还讨论了性能优化方法(如硬件加速、异步处理)和功能扩展(如音量调节、多格式支持)。针对AI视觉算法对接,文章提供了YUV/RGB数据处理示例,便于开发者在Python环境下进行算法集成。最终,播放器凭借低延迟、高兼容性和灵活扩展性,为实时交互场景提供了高效解决方案。
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
|
22天前
|
公司电脑网络监控场景下 Python 广度优先搜索算法的深度剖析
在数字化办公时代,公司电脑网络监控至关重要。广度优先搜索(BFS)算法在构建网络拓扑、检测安全威胁和优化资源分配方面发挥重要作用。通过Python代码示例展示其应用流程,助力企业提升网络安全与效率。未来,更多创新算法将融入该领域,保障企业数字化发展。
42 10
|
23天前
|
基于 Python 广度优先搜索算法的监控局域网电脑研究
随着局域网规模扩大,企业对高效监控计算机的需求增加。广度优先搜索(BFS)算法凭借其层次化遍历特性,在Python中可用于实现局域网内的计算机设备信息收集、网络连接状态监测及安全漏洞扫描,确保网络安全与稳定运行。通过合理选择数据结构与算法,BFS显著提升了监控效能,助力企业实现智能化的网络管理。
28 7
解锁文档管理系统高效检索奥秘:Python 哈希表算法探究
在数字化时代,文档管理系统犹如知识宝库,支撑各行各业高效运转。哈希表作为核心数据结构,通过哈希函数将数据映射为固定长度的哈希值,实现快速查找与定位。本文聚焦哈希表在文档管理中的应用,以Python代码示例展示其高效检索特性,并探讨哈希冲突解决策略,助力构建智能化文档管理系统。
探究办公室电脑怎么共享文件的 Python 算法
在数字化办公环境中,高效文件共享是提升工作效率的关键。本文聚焦于使用Python实现办公室电脑文件共享的算法,涵盖需求分析、基础实现及优化拓展。通过socket编程和文件流操作,实现文件传输,并探讨多线程、权限管理和文件索引等优化措施,确保文件共享的安全性和便捷性,助力现代办公协同。
|
10月前
|
在Python中,用于实现哈希表的数据结构主要是字典(`dict`)
在Python中,用于实现哈希表的数据结构主要是字典(`dict`)
104 1

热门文章

最新文章