Skip to content

Commit 54e6950

Browse files
authored
Merge pull request #264 from PEZ/zig-lev-fixes
levenshtein: Zig: use memcopy and avoid using allocators
2 parents 2541eb5 + 4fbe62d commit 54e6950

File tree

1 file changed

+7
-11
lines changed

1 file changed

+7
-11
lines changed

levenshtein/zig/code.zig

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const std = @import("std");
33
/// Calculates the Levenshtein distance between two strings using Wagner-Fischer algorithm
44
/// Space Complexity: O(min(m,n)) - only uses two arrays instead of full matrix
55
/// Time Complexity: O(m*n) where m and n are the lengths of the input strings
6-
fn levenshteinDistance(allocator: std.mem.Allocator, s1: []const u8, s2: []const u8) !usize {
6+
fn levenshteinDistance(s1: []const u8, s2: []const u8) usize {
77
// Early termination checks
88
if (std.mem.eql(u8, s1, s2)) return 0;
99
if (s1.len == 0) return s2.len;
@@ -17,14 +17,12 @@ fn levenshteinDistance(allocator: std.mem.Allocator, s1: []const u8, s2: []const
1717
const n = str2.len;
1818

1919
// Use two arrays instead of full matrix for space optimization
20-
var prev_row = try allocator.alloc(usize, m + 1);
21-
defer allocator.free(prev_row);
22-
var curr_row = try allocator.alloc(usize, m + 1);
23-
defer allocator.free(curr_row);
20+
var prev_row: [256]usize = undefined;
21+
var curr_row: [256]usize = undefined;
2422

2523
// Initialize first row
26-
for (prev_row, 0..) |*cell, i| {
27-
cell.* = i;
24+
for (0..m + 1) |i| {
25+
prev_row[i] = i;
2826
}
2927

3028
// Main computation loop
@@ -47,9 +45,7 @@ fn levenshteinDistance(allocator: std.mem.Allocator, s1: []const u8, s2: []const
4745
}
4846

4947
// Swap rows
50-
const temp = prev_row;
51-
prev_row = curr_row;
52-
curr_row = temp;
48+
@memcpy(prev_row[0..m + 1], curr_row[0..m + 1]);
5349
}
5450

5551
return prev_row[m];
@@ -78,7 +74,7 @@ pub fn main() !void {
7874
var j: usize = 1;
7975
while (j < args.len) : (j += 1) {
8076
if (i != j) {
81-
const distance = try levenshteinDistance(allocator, args[i], args[j]);
77+
const distance = levenshteinDistance(args[i], args[j]);
8278
if (min_distance == -1 or distance < @as(usize, @intCast(min_distance))) {
8379
min_distance = @as(isize, @intCast(distance));
8480
}

0 commit comments

Comments
 (0)